MySQLでテストデータを作成する
公開日: 2024/05/01
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)