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

  

  

此文章的数据量在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 比;基地。txt

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