ユーザ用ツール

サイト用ツール


db:mysql:大量データ生成

大量データ生成

検証用の、大量のデータを生成する方法について。
検索すると、以下のような方法が紹介されていましたが、私の環境(Mysql 5.7)で試すと、オートインクリメントの値が飛び飛びになっており、検証に使えませんでした。

  1. create table sample (
  2. id int primary key auto_increment,
  3. name varchar(10),
  4. created_at datetime
  5. );
  6.  
  7. # 空データを挿入(倍々で増える)
  8. insert into sample () values (); --1行作成
  9. insert into sample (id) select 0 from sample; --2行になる
  10. insert into sample (id) select 0 from sample; --4行になる
  11. insert into sample (id) select 0 from sample; --8行になる
  12. insert into sample (id) select 0 from sample; --16行になる
  13.  
  14. # id を確認すると歯抜けになっている
  15. select id from sample limit 10;
  16. +----+
  17. | id |
  18. +----+
  19. | 1 |
  20. | 2 |
  21. | 3 |
  22. | 4 |
  23. | 6 |
  24. | 7 |
  25. | 8 |
  26. | 9 |
  27. | 13 |
  28. | 14 |
  29. +----+

そこで別のサイトで紹介されていた、テーブルを単純結合する方法を試します。

  1. create table sample (
  2. id int primary key auto_increment,
  3. name varchar(10),
  4. tel varchar(16),
  5. pref tinyint unsigned,
  6. address varchar(50),
  7. created_at datetime
  8. );
  9.  
  10. # 元となるデータを10件作る
  11. insert into sample (name)
  12. values
  13. (''), (''), (''), (''), (''), (''), (''), (''), (''), ('');
  14.  
  15. # 単純結合して insert(結合するテーブルを増やす毎に10倍される)
  16. insert into sample (name)
  17. select s1.name
  18. from sample s1, sample s2, sample s3, sample s4;
  19.  
  20. # 4つ結合で1万件 + 10件
  21. select count(id) from sample;
  22. +-----------+
  23. | count(id) |
  24. +-----------+
  25. | 10010 |
  26. +-----------+
  27.  
  28. # オートインクリメントが連番になっていることを確認
  29. select id from sample limit 10;
  30. +----+
  31. | id |
  32. +----+
  33. | 1 |
  34. | 2 |
  35. | 3 |
  36. | 4 |
  37. | 5 |
  38. | 6 |
  39. | 7 |
  40. | 8 |
  41. | 9 |
  42. | 10 |
  43. +----+
  44.  
  45. # update でランダムな値を入れてあげる
  46. update sample set
  47. name = concat('山田 ', id, '郎')
  48. , tel = ceil(rand() * 100000000000)
  49. , pref = ceil(rand() * 47)
  50. , address = substring(md5(rand()), 1, 20)
  51. , created_at = addtime(concat_ws(' ','2014-01-01' + interval rand() * 1460 day, '00:00:00'), sec_to_time(floor(0 + (rand() * 86401))));
  52.  
  53. # 1万件の検証用データの作成完了
  54. select * from sample limit 10;
  55. +----+--------------+-------------+------+----------------------+---------------------+
  56. | id | name | tel | pref | address | created_at |
  57. +----+--------------+-------------+------+----------------------+---------------------+
  58. | 1 | 山田 1 | 17487518972 | 30 | ada50a04459f9473fa8c | 2014-07-17 20:50:14 |
  59. | 2 | 山田 2 | 93616008846 | 4 | 91dc61580389d0451618 | 2016-07-13 10:45:15 |
  60. | 3 | 山田 3 | 34149720738 | 18 | 8e19ced55fb4d9c916e0 | 2017-06-21 23:09:41 |
  61. | 4 | 山田 4 | 22151722128 | 10 | 9bab6059a8c00dacac59 | 2015-05-28 13:28:19 |
  62. | 5 | 山田 5 | 75411782391 | 5 | 558022114ca362d88345 | 2016-05-16 10:55:18 |
  63. | 6 | 山田 6 | 49514332740 | 6 | b27ceb4a935d5a5c3af9 | 2014-01-07 19:40:23 |
  64. | 7 | 山田 7 | 8581452639 | 46 | fdfa1938c939cb5b421d | 2014-03-18 11:34:46 |
  65. | 8 | 山田 8 | 25663569408 | 40 | 59974cf84780f1499707 | 2016-02-24 11:01:20 |
  66. | 9 | 山田 9 | 68475667824 | 3 | 9fd65b6af7480d51b616 | 2016-12-17 04:11:57 |
  67. | 10 | 山田 10 | 65366457092 | 35 | cd0e5758de45f586c335 | 2016-03-14 11:33:55 |
  68. +----+--------------+-------------+------+----------------------+---------------------+

コメント

コメントを入力. Wiki文法が有効です:
 
db/mysql/大量データ生成.txt · 最終更新: 2019/03/25 13:01 by yusuke_komori