此文章的数据量在100 w,如果想要千万级,调大数量即可,但是不要大量使用兰德()或者uuid()会导致性能下降
在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建大量的基础数据供我们测试,模拟线上的真实环境。
废话,总不能让我去线上去测试吧,会被DBA砍死的
,,,1. 编写代码,通过代码批量插库(本人使用过,步骤太繁琐,性能不高,不推荐)
,,,2. 编写存储过程和函数执行(本文实现方式1)
,,,3.临时数据表方式执行(本文实现方式2,强烈推荐该方式,非常简单,数据插入快速,100 w,只需几秒)
,,,4. 一行一行手动插入(WTF,去死吧)
不管用何种方式,我要插在那张表总要创建的吧
创建表“t_user”( “id”int(11)不是零AUTO_INCREMENT, c_user_id varchar (36) NOT NULL违约”, c_name varchar (22) NOT NULL违约”, c_province_id int(11)非空, c_city_id int(11)非空, create_time datetime非空, 主键(“id”), 关键“idx_user_id”(“c_user_id”) )引擎=InnoDB的默认字符集=utf8mb4;
创建内存表
利用MySQL内存表插入速度快的特点,我们先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中
创建表“t_user_memory”( “id”int(11)不是零AUTO_INCREMENT, c_user_id varchar (36) NOT NULL违约”, c_name varchar (22) NOT NULL违约”, c_province_id int(11)非空, c_city_id int(11)非空, create_time datetime非空, 主键(“id”), 关键“idx_user_id”(“c_user_id”) )引擎=内存默认字符集=utf8mb4;
创建函数和存储过程
#创建随机字符串和随机时间的函数 mysql>分隔符$ $ mysql>创建定义者=案盄“%”函数“randStr”(n INT)返回varchar(255)字符集utf8mb4 →确定的 →开始 →声明chars_str varchar(100)默认“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”; →声明return_str varchar(255)违约”; →声明我INT默认0; →虽然我& lt;n做 →设置return_str=concat (return_str substring (chars_str,地板兰德()* (1 + 62),1)); →我=+ 1; →结束时; →返回return_str; →结束$ $ 查询好,0行影响(0.00秒) mysql>创建定义者=案盄“%”功能的randDataTime (sd DATETIME, ed DATETIME)返回DATETIME →确定的 →开始 →声明子INT默认0; →声明ret DATETIME; →设置子=ABS (UNIX_TIMESTAMP (ed) -UNIX_TIMESTAMP (sd)); →设置ret=DATE_ADD (sd,间隔层兰德()*(1 +(低于))秒); →返回受潮湿腐烂; →结束$ $ mysql>分隔符; #创建插入数据存储过程 mysql>创建定义者=案盄“%”程序“add_t_user_memory”(n int) →开始 →声明我INT默认1; →虽然(我& lt;=n) →插入t_user_memory (c_user_id c_name、c_province_id c_city_id, create_time)值(uuid (), randStr(20),地板(RAND() * 1000),地板(RAND() * 100)、现在()); →我=+ 1; →结束时; →结束 →$ $ 查询好,0行影响(0.01秒)
调用存储过程
mysql>调用add_t_user_memory (1000000); 错误1114 (HY000):表“t_user_memory”充满
出现内存已满时,修改max_heap_table_size参数的大小,我使用64米内存,插入了22 w数据,看情况改,不过这个值不要太大,默认32 m或者64就好,生产环境不要乱尝试
从内存表插入普通表
mysql>从t_user_memory插入t_user SELECT *; 查询好了,218953行影响(1.70秒) 记录:218953副本:警告:0
创建临时数据表tmp_table
创建表tmp_table ( id INT, 主键(id));
用python或者bash生成100 w记录的数据文件(python瞬间就会生成完)
python(推荐):python - c”我的范围(1 + 1000000):打印(i)”比;基地。txt
bash(不推荐,会比较慢):bash i=1;(我勒1000000美元);echo $ i;让我+=1;done 比;基地。txtMySQL如何快速的创建千万级测试数据