MySQLのテストデータを作成する テーブルを作成する。

CREATE TABLE dummy (
id INT PRIMARY KEY AUTO_INCREMENT,
data1 VARCHAR(160),
data2 VARCHAR(160),
data3 VARCHAR(160),
data4 INT,
data5 INT,
data6 INT
);

まずはテストデータ作成と思ったがWHILEでINSERTは遅すぎたため、1000*10000回でBULK INSERTを実施して1,000,000データを作成した。

delimiter //
DROP PROCEDURE IF EXISTS insert_dummy_data;
CREATE PROCEDURE insert_dummy_data()
BEGIN
-- 1セットごとの回数
SET @count = 1000;
-- 何セット実施するか
SET @set = 10000;

SET @i = 0;
WHILE @i < @set DO
SET @j = 0;
SET @query = 'INSERT INTO dummy (data1, data2, data3, data4, data5, data6) VALUES';
WHILE @j < @count DO
SET @value = ', (SHA1(RAND()), SHA1(RAND()), SHA1(RAND()) ,CEIL(RAND()*1000), CEIL(RAND()*1000), CEIL(RAND()*1000))';
-- 最初はコンマ不要のため消す
IF @j = 0 THEN
SET @value = SUBSTRING(@value, 2);
END IF;
SET @query = CONCAT(@query, @value);
SET @j = @j + 1;
END WHILE;

code:_
  SET @query = CONCAT(@query, ' ;');
  PREPARE stmt FROM @query;
  EXECUTE stmt;
 
  SET @i = @i + 1;
END WHILE;

END;
//
delimiter ;

SELECT実行する。

mysql> select count(*) from dummy;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (2.72 sec)

mysql> select data1, data4 from dummy order by data1 asc limit 10;
+------------------------------------------+-------+
| data1                                    | data4 |
+------------------------------------------+-------+
| 0000004069638d49c71c9cccb2bccd53261fea02 |    62 |
| 0000010172faae7243239df7da72060949437d7f |   129 |
| 0000010172faae7243239df7da72060949437d7f |   198 |
| 00000caccdbbcec544c94de005002457e95b0bdd |   366 |
| 00000caccdbbcec544c94de005002457e95b0bdd |   212 |
| 00000caccdbbcec544c94de005002457e95b0bdd |   259 |
| 000011ababba72e668c657ab42e89abb80ab00d1 |   907 |
| 000011ababba72e668c657ab42e89abb80ab00d1 |   297 |
| 000011ababba72e668c657ab42e89abb80ab00d1 |   837 |
| 000011ababba72e668c657ab42e89abb80ab00d1 |    30 |
+------------------------------------------+-------+
10 rows in set (4.26 sec)

compose.ymlを作成し、上記のストアド実行とテーブル作成を自動実行させる。

version: '3'
services:
mysql57:
image: mysql:5.7
volumes:
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=dummy

mysql80:
image: mysql:8.0
volumes:
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=dummy

インデックス貼らずにソートする性能を5.7と8.0で見てみたかったけど、想像よりは変わらなかった。

MySQL5.7

mysql> select id from dummy order by data1 limit 10;
+---------+
| id      |
+---------+
| 8694003 |
| 6867951 |
| 6791951 |
| 7941686 |
| 1150486 |
| 4741556 |
| 1443772 |
| 1914972 |
| 2553372 |
| 1969052 |
+---------+
10 rows in set (3.38 sec)

MySQL8.0

mysql> select id from dummy order by data1 limit 10;
+---------+
| id      |
+---------+
| 8427342 |
| 1746525 |
| 1561585 |
| 7915185 |
| 5467985 |
| 9398620 |
| 7301020 |
| 2547686 |
|  313286 |
| 3946086 |
+---------+
10 rows in set (5.06 sec)