目的
とりあえず大量のデータを突っ込む、データの質は問わない
MariaDB,MySQL,PostgreSQL関係なく使えるよ
環境
OS:Ubuntu14.04
DB:MariaDB 10.0.11
thinkpad T440p
以下のようなテーブルに適当なデータを大量に入れてみる
SET CHARSET utf8;
USE my_test;
CREATE TABLE test_table2(
col1 INT NOT NULL DEFAULT 0,
col2 INT NOT NULL DEFAULT 0,
col3 INT NOT NULL DEFAULT 0,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
delete_time DATETIME DEFAULT NULL,
PRIMARY KEY (col1,col2,col3)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
クエリを生成する
ジェネレータツールのような何かは使用せずに簡単にシェルスクリプトでクエリを作る
#!/bin/sh
echo "INSERT IGNORE INTO test_table2 (col1,col2,col3,create_time,update_time) VALUES" > insert.sql
for i in `seq 1 1000`
do
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW())," >> insert.sql
done
echo "(FLOOR(RAND()*3000000),FLOOR(RAND()*1000000)%15,FLOOR(RAND()*1000000)%3,NOW(),NOW());" >> insert.sql
FLOORとRANDを使ってcol1は300万以下、col2は15以下、col3は3以下の整数を入れるようなbulk insertクエリを作成
これで5000行を挿入するクエリが作成完了
IGNOREを使用しているので、プライマリキーのデータが被った場合は無視される
これを繰り返して適当な回数挿入する
#!/bin/sh
set -e
mariadb='/PATH/mariadb/bin/mysql'
for i in `seq 1 2000`
do
$mariadb -u* -p*** -Dmy_test < insert.sql
done
Insert
$ time bash insert_random_rows.sh
real 3m40.434s
user 0m15.065s
sys 0m3.685s
MariaDB [my_test]> select table_schema, table_name, table_rows from information_schema.tables where table_schema='my_test' AND table_name='test_table2';
+--------------+-------------+------------+
| table_schema | table_name | table_rows |
+--------------+-------------+------------+
| my_test | test_table2 | 9273104 |
+--------------+-------------+------------+
1 row in set (0.00 sec)
4分かからずに1000万行近くのデータを挿入できた
その他
時刻のところもランダムっぽくしたいならNOW()のところをINTERVAL関数を使って
NOW() - INTERVAL FLOOR(RAND()*10000) HOUR
とか書くと適当っぽい時刻になる