网易首页 > 网易号 > 正文 申请入驻

MySQL 快速创建千万级测试数据

0
分享至

备注:此文章的数据量在100W,如果想要千万级,调大数量即可,但是不要大量使用rand() 或者uuid() 会导致性能下降

背景

在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建大量的基础数据供我们测试,模拟线上的真实环境。

创建测试数据的方式

  1. 编写代码,通过代码批量插库(本人使用过,步骤太繁琐,性能不高,不推荐)
  2. 编写存储过程和函数执行(本文实现方式1)
  3. 临时数据表方式执行 (本文实现方式2,强烈推荐该方式,非常简单,数据插入快速,100W,只需几秒)
  4. 一行一行手动插入,(WTF,去死吧)

创建基础表结构

不管用何种方式,我要插在那张表总要创建的吧

CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c_user_id` varchar(36) NOT NULL DEFAULT '',
`c_name` varchar(22) NOT NULL DEFAULT '',
`c_province_id` int(11) NOT NULL,
`c_city_id` int(11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`c_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

方式1:采用存储过程和内存表

创建内存表

利用 MySQL 内存表插入速度快的特点,我们先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中

CREATE TABLE `t_user_memory` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c_user_id` varchar(36) NOT NULL DEFAULT '',
`c_name` varchar(22) NOT NULL DEFAULT '',
`c_province_id` int(11) NOT NULL,
`c_city_id` int(11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`c_user_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;

创建函数和存储过程

# 创建随机字符串和随机时间的函数
mysql> delimiter $$
mysql> CREATE DEFINER=`root`@`%` FUNCTION `randStr`(n INT) RETURNS varchar(255) CHARSET utf8mb4
-> DETERMINISTIC
-> BEGIN
-> DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
-> DECLARE return_str varchar(255) DEFAULT '' ;
-> DECLARE i INT DEFAULT 0;
-> WHILE i < n DO
-> SET return_str = concat(return_str, substring(chars_str, FLOOR(1 + RAND() * 62), 1));
-> SET i = i + 1;
-> END WHILE;
-> RETURN return_str;
-> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DEFINER=`root`@`%` FUNCTION `randDataTime`(sd DATETIME,ed DATETIME) RETURNS datetime
-> DETERMINISTIC
-> BEGIN
-> DECLARE sub INT DEFAULT 0;
-> DECLARE ret DATETIME;
-> SET sub = ABS(UNIX_TIMESTAMP(ed)-UNIX_TIMESTAMP(sd));
-> SET ret = DATE_ADD(sd,INTERVAL FLOOR(1+RAND()*(sub-1)) SECOND);
-> RETURN ret;
-> END $$

mysql> delimiter ;

# 创建插入数据存储过程
mysql> CREATE DEFINER=`root`@`%` PROCEDURE `add_t_user_memory`(IN n int)
-> BEGIN
-> DECLARE i INT DEFAULT 1;
-> WHILE (i <= n) DO
-> INSERT INTO t_user_memory (c_user_id, c_name, c_province_id,c_city_id, create_time) VALUES (uuid(), randStr(20), FLOOR(RAND() * 1000), FLOOR(RAND() * 100), NOW());
-> SET i = i + 1;
-> END WHILE;
-> END
-> $$
Query OK, 0 rows affected (0.01 sec)

调用存储过程

mysql> CALL add_t_user_memory(1000000);
ERROR 1114 (HY000): The table 't_user_memory' is full

出现内存已满时,修改 max_heap_table_size 参数的大小,我使用64M内存,插入了22W数据,看情况改,不过这个值不要太大,默认32M或者64M就好,生产环境不要乱尝试

从内存表插入普通表

mysql> INSERT INTO t_user SELECT * FROM t_user_memory;
Query OK, 218953 rows affected (1.70 sec)
Records: 218953 Duplicates: 0 Warnings: 0

方式2:采用临时表

创建临时数据表tmp_table

CREATE TABLE tmp_table (
id INT,
PRIMARY KEY (id)

用 python或者bash 生成 100w 记录的数据文件(python瞬间就会生成完)

python(推荐):

python -c "for i in range(1, 1+1000000): print(i)" > base.txt

导入数据到临时表tmp_table中

mysql> load data infile '/Users/LJTjintao/temp/base.txt' replace into table tmp_table;
Query OK, 1000000 rows affected (2.55 sec)
Records: 1000000 Deleted: 0 Skipped: 0 Warnings: 0

千万级数据 20秒插入完成

注意:导入数据时有可能会报错,原因是mysql默认没有开secure_file_priv( 这个参数用来限制数据导入和导出操作的效果,例如执行LOAD DATA、SELECT … INTO OUTFILE语句和LOAD_FILE()函数。这些操作需要用户具有FILE权限。)

解决办法:在mysql的配置文件中(my.ini 或者 my.conf)中添加 secure_file_priv = /Users/LJTjintao/temp/`, 然后重启mysql 解决

以临时表为基础数据,插入数据到t_user中,100W数据插入需要10.37s

mysql> INSERT INTO t_user
-> SELECT
-> id,
-> uuid(),
-> CONCAT('userNickName', id),
-> FLOOR(Rand() * 1000),
-> FLOOR(Rand() * 100),
-> NOW()
-> FROM
-> tmp_table;
Query OK, 1000000 rows affected (10.37 sec)
Records: 1000000 Duplicates: 0 Warnings: 0

更新创建时间字段让插入的数据的创建时间更加随机

UPDATE t_user SET create_time=date_add(create_time, interval FLOOR(1 + (RAND() * 7)) year);

Query OK, 1000000 rows affected (5.21 sec)
Rows matched: 1000000 Changed: 1000000 Warnings: 0

mysql> UPDATE t_user SET create_time=date_add(create_time, interval FLOOR(1 + (RAND() * 7)) year);


Query OK, 1000000 rows affected (4.77 sec)
Rows matched: 1000000 Changed: 1000000 Warnings: 0

mysql> select * from t_user limit 30;
| id | c_user_id | c_name | c_province_id | c_city_id | create_time |
| 1 | bf5e227a-7b84-11e9-9d6e-751d319e85c2 | userNickName1 | 84 | 64 | 2015-11-13 21:13:19 |
| 2 | bf5e26f8-7b84-11e9-9d6e-751d319e85c2 | userNickName2 | 967 | 90 | 2019-11-13 20:19:33 |
| 3 | bf5e2810-7b84-11e9-9d6e-751d319e85c2 | userNickName3 | 623 | 40 | 2014-11-13 20:57:46 |
| 4 | bf5e2888-7b84-11e9-9d6e-751d319e85c2 | userNickName4 | 140 | 49 | 2016-11-13 20:50:11 |
| 5 | bf5e28f6-7b84-11e9-9d6e-751d319e85c2 | userNickName5 | 47 | 75 | 2016-11-13 21:17:38 |
| 6 | bf5e295a-7b84-11e9-9d6e-751d319e85c2 | userNickName6 | 642 | 94 | 2015-11-13 20:57:36 |
| 7 | bf5e29be-7b84-11e9-9d6e-751d319e85c2 | userNickName7 | 780 | 7 | 2015-11-13 20:55:07 |
| 8 | bf5e2a4a-7b84-11e9-9d6e-751d319e85c2 | userNickName8 | 39 | 96 | 2017-11-13 21:42:46 |
| 9 | bf5e2b58-7b84-11e9-9d6e-751d319e85c2 | userNickName9 | 731 | 74 | 2015-11-13 22:48:30 |
| 10 | bf5e2bb2-7b84-11e9-9d6e-751d319e85c2 | userNickName10 | 534 | 43 | 2016-11-13 22:54:10 |
| 11 | bf5e2c16-7b84-11e9-9d6e-751d319e85c2 | userNickName11 | 572 | 55 | 2018-11-13 20:05:19 |
| 12 | bf5e2c70-7b84-11e9-9d6e-751d319e85c2 | userNickName12 | 71 | 68 | 2014-11-13 20:44:04 |
| 13 | bf5e2cca-7b84-11e9-9d6e-751d319e85c2 | userNickName13 | 204 | 97 | 2019-11-13 20:24:23 |
| 14 | bf5e2d2e-7b84-11e9-9d6e-751d319e85c2 | userNickName14 | 249 | 32 | 2019-11-13 22:49:43 |
| 15 | bf5e2d88-7b84-11e9-9d6e-751d319e85c2 | userNickName15 | 900 | 51 | 2019-11-13 20:55:26 |
| 16 | bf5e2dec-7b84-11e9-9d6e-751d319e85c2 | userNickName16 | 854 | 74 | 2018-11-13 22:07:58 |
| 17 | bf5e2e50-7b84-11e9-9d6e-751d319e85c2 | userNickName17 | 136 | 46 | 2013-11-13 21:53:34 |
| 18 | bf5e2eb4-7b84-11e9-9d6e-751d319e85c2 | userNickName18 | 897 | 10 | 2018-11-13 20:03:55 |
| 19 | bf5e2f0e-7b84-11e9-9d6e-751d319e85c2 | userNickName19 | 829 | 83 | 2013-11-13 20:38:54 |
| 20 | bf5e2f68-7b84-11e9-9d6e-751d319e85c2 | userNickName20 | 683 | 91 | 2019-11-13 20:02:42 |
| 21 | bf5e2fcc-7b84-11e9-9d6e-751d319e85c2 | userNickName21 | 511 | 81 | 2013-11-13 21:16:48 |
| 22 | bf5e3026-7b84-11e9-9d6e-751d319e85c2 | userNickName22 | 562 | 35 | 2019-11-13 20:15:52 |
| 23 | bf5e3080-7b84-11e9-9d6e-751d319e85c2 | userNickName23 | 91 | 39 | 2016-11-13 20:28:59 |
| 24 | bf5e30da-7b84-11e9-9d6e-751d319e85c2 | userNickName24 | 677 | 21 | 2016-11-13 21:37:15 |
| 25 | bf5e3134-7b84-11e9-9d6e-751d319e85c2 | userNickName25 | 50 | 60 | 2018-11-13 20:39:20 |
| 26 | bf5e318e-7b84-11e9-9d6e-751d319e85c2 | userNickName26 | 856 | 47 | 2018-11-13 21:24:53 |
| 27 | bf5e31e8-7b84-11e9-9d6e-751d319e85c2 | userNickName27 | 816 | 65 | 2014-11-13 22:06:26 |
| 28 | bf5e324c-7b84-11e9-9d6e-751d319e85c2 | userNickName28 | 806 | 7 | 2019-11-13 20:17:30 |
| 29 | bf5e32a6-7b84-11e9-9d6e-751d319e85c2 | userNickName29 | 973 | 63 | 2014-11-13 21:08:09 |
| 30 | bf5e3300-7b84-11e9-9d6e-751d319e85c2 | userNickName30 | 237 | 29 | 2018-11-13 21:48:17 |
30 rows in set (0.01 sec)

juejin.im/post/5ce372c36fb9a07ef63fb191

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
国家发展改革委:将符合条件的国四排放标准燃油车纳入报废更新补贴

国家发展改革委:将符合条件的国四排放标准燃油车纳入报废更新补贴

界面新闻
2025-01-08 10:12:34
一个国家的精神,就印在他们的钞票上

一个国家的精神,就印在他们的钞票上

尚曦读史
2025-01-07 23:45:38
星星已找到,面容憔悴、已剃光头,犯罪集团内部聊天截图曝光!

星星已找到,面容憔悴、已剃光头,犯罪集团内部聊天截图曝光!

一支破笔半支烟
2025-01-07 18:44:48
离异少妇勾引已婚男人,车震后索要20万补偿,惨遭杀害焚尸

离异少妇勾引已婚男人,车震后索要20万补偿,惨遭杀害焚尸

胖胖侃咖
2025-01-08 08:00:06
重庆荣昌区委书记号召干部买新衣、下馆子,带头消费

重庆荣昌区委书记号召干部买新衣、下馆子,带头消费

界面新闻
2025-01-08 10:00:10
泰警方披露王星现状:状态正常,目前不允许探视 当事人自述过境后发现被骗,不敢反抗

泰警方披露王星现状:状态正常,目前不允许探视 当事人自述过境后发现被骗,不敢反抗

红星新闻
2025-01-07 22:51:15
西藏地震捐款最新名单,西藏日喀则地震捐款企业名单,捐了多少?

西藏地震捐款最新名单,西藏日喀则地震捐款企业名单,捐了多少?

小淇言说
2025-01-08 02:18:00
郑钦文捐款100万,支持西藏日喀则地震救援行动

郑钦文捐款100万,支持西藏日喀则地震救援行动

直播吧
2025-01-08 10:56:22
交警扣押92岁老人,放狠话说认识谁都没用,老人亮明身份引起震动

交警扣押92岁老人,放狠话说认识谁都没用,老人亮明身份引起震动

城事录主
2025-01-07 09:40:42
9票支持:9票反对未通过!绿提案改选台湾立法院长,遭蓝白封杀

9票支持:9票反对未通过!绿提案改选台湾立法院长,遭蓝白封杀

新时光点滴
2025-01-08 09:50:43
又一起失联!23岁中国船员疑被绑至缅甸,遭殴打视频曝光!家属被勒索10万元

又一起失联!23岁中国船员疑被绑至缅甸,遭殴打视频曝光!家属被勒索10万元

新民晚报
2025-01-08 10:04:01
零下3℃,广东气温将创2025新低,湛江人请注意保暖→

零下3℃,广东气温将创2025新低,湛江人请注意保暖→

湛江日报
2025-01-08 08:18:22
闹大!王星成功获救,花200万赎回,电诈园区扬名,泰国总理发声

闹大!王星成功获救,花200万赎回,电诈园区扬名,泰国总理发声

鋭娱之乐
2025-01-07 23:09:00
燕冬萍如愿离婚,丢了爱她的人,前夫止损及时,法官是个明白人!

燕冬萍如愿离婚,丢了爱她的人,前夫止损及时,法官是个明白人!

晓徙历史
2025-01-08 09:05:15
全球最危险的10个国家,缅北排不上号,专家提醒:不要去旅游

全球最危险的10个国家,缅北排不上号,专家提醒:不要去旅游

何为惠
2024-12-21 09:26:30
抽象!山东一医院用体检卡抵员工工资,医院:体检业务量没上去

抽象!山东一医院用体检卡抵员工工资,医院:体检业务量没上去

柚子新媒
2025-01-07 21:36:47
雷军晒与小米获奖工程师合照 网友:领导居然站最边上?

雷军晒与小米获奖工程师合照 网友:领导居然站最边上?

手机中国
2025-01-07 15:31:25
王星事件细节披露,知情人称交了200万,动用部队才把他捞出来

王星事件细节披露,知情人称交了200万,动用部队才把他捞出来

辣条小剧场
2025-01-08 02:26:16
还要死掉多少天才,才会引起我们的重视?

还要死掉多少天才,才会引起我们的重视?

尚曦读史
2025-01-07 22:47:52
中国乒乓球曝丑闻,乒协主席被举报涉黑涉赌,已被多次传唤

中国乒乓球曝丑闻,乒协主席被举报涉黑涉赌,已被多次传唤

保持热爱0263
2025-01-08 01:57:30
2025-01-08 12:43:00
互联网干货博主
互联网干货博主
我是专注分享互联网干货的博主
278文章数 1339关注度
往期回顾 全部

科技要闻

定了!买手机,国家最高补贴500元

头条要闻

多位老师回应“刘强东发10万现金” 师生旧合照披露

头条要闻

多位老师回应“刘强东发10万现金” 师生旧合照披露

体育要闻

消失3年后,国乒冠军成为一名大学老师

娱乐要闻

王星假装顺从保命,采访时看泰警脸色

财经要闻

重要通知!以旧换新加力扩围

汽车要闻

10万元级无图智驾 悦也PLUS全路况实测

态度原创

健康
家居
本地
房产
公开课

抑郁症患者称好的“乌托邦”宝地

家居要闻

诠释未来 置身星际之间

本地新闻

我和我的家乡|一“津”到底,美在不言中

房产要闻

惊艳白鹅潭的“鼎豪瑧品”,竟是保利造!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版