LoginSignup
12
11

More than 5 years have passed since last update.

DBにランダムなデータを大量に挿入する

Posted at

目的

とりあえず大量のデータを突っ込む、データの質は問わない
MariaDB,MySQL,PostgreSQL関係なく使えるよ

環境
OS:Ubuntu14.04
DB:MariaDB 10.0.11
thinkpad T440p

以下のようなテーブルに適当なデータを大量に入れてみる

create.sql
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;

クエリを生成する

ジェネレータツールのような何かは使用せずに簡単にシェルスクリプトでクエリを作る

gen_random_rows.sh
#!/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を使用しているので、プライマリキーのデータが被った場合は無視される

これを繰り返して適当な回数挿入する

insert_random_rows.sh
#!/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
とか書くと適当っぽい時刻になる

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11