详解MySQL如何按表创建千万级的压测数据

数据库 MySQL
有时我们要对系统做压测,或者数据库压力测试,这时候需要对某些表插入几百万或者上千万数据,下面介绍下怎么利用MySQL循环和存储过程对特定表的创建千万行数据。

有时我们要对系统做压测,或者数据库压力测试,这时候需要对某些表插入几百万或者上千万数据,下面介绍下怎么利用MySQL循环和存储过程对特定表的创建千万行数据。

1. 准备测试表

  1. CREATE TABLE `username` ( 
  2.     `uid` INT( 11 ) UNSIGNED NOT NULL default 1235678901, 
  3.     `username` VARCHAR( 20 ) , 
  4.     `email` VARCHAR( 30 ) , 
  5.     `password` VARCHAR( 32 ) , 
  6.     `birthday` date, 
  7.     `gender` VARCHAR(10) , 
  8.     avatar MEDIUMBLOB, 
  9.     PRIMARY KEY ( `uid` ) 
  10. ENGINE = INNODB DEFAULT CHARSET=utf8

2. 随机生成数据

MySQL里面自带一个随机数生成的函数RAND(),它能生成0-1的浮点数

RAND函数生成随机数:

详解MySQL如何按表创建<span><span><span><i style=千万级的压测数据" src="http://p3.pstatp.com/large/pgc-image/18a9e01795184b6b9230e47f707ee6a9" width="348" height="148">

3. 随机生成给定数目的字符串

这里用mysql循环,循环采用WHILE循环,循环里面采用字符串拼接函数CONCAT

  1. SET GLOBAL log_bin_trust_function_creators = 1;  
  2. CREATE DEFINER = `root` @`%` FUNCTION `rand_string` ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8 BEGIN 
  3.     DECLARE 
  4.         chars_str VARCHAR ( 100 ) DEFAULT 'hwbtestABCDEFG23141HIJ6712dfghjkqwevbnqmwerqwerqwreqw214123e1214c12dssaf89'; 
  5.     DECLARE 
  6.         return_str VARCHAR ( 255 ) DEFAULT ''; 
  7.     DECLARE 
  8.         i INT DEFAULT 0; 
  9.     WHILE 
  10.             i < n DO 
  11.              
  12.             SET return_str = concat( return_str, substring( chars_str, FLOOR( 1 + RAND( ) * 80 ), 1 ) ); 
  13.          
  14.         SET ii = i + 1; 
  15.          
  16.     END WHILE; 
  17. RETURN return_str; 
  18. END; 

详解MySQL如何按表创建<span><span><span><i style=千万级的压测数据" src="http://p9.pstatp.com/large/pgc-image/d8d78674aade489ebe63e79b6e807417" width="640" height="349">

用户名和密码都可以通过以上的方式添加。

邮箱的添加方式:可直接在insert的value对应字段写上concat(rand_string(5), '@qq.com')

4. 随机生成DATE和DATETIME类型

(1) DATE类型

  1. CREATE DEFINER = `root` @`%` FUNCTION `randDate` ( ) RETURNS VARCHAR ( 255 ) CHARSET utf8 BEGIN 
  2.     DECLARE 
  3.         aDate CHAR ( 10 ) DEFAULT ''; 
  4. /*CONCAT (1949 + FLOOR( ( RAND( ) * 70 ) ) 表示 1949到2019的随机数据  
  5.     --L PAD ( FLOOR( 1 + ( RAND( ) * 12 ) ), 2, 0 ) 表示月份的生成,小于 10自动补0  
  6.     --L PAD ( FLOOR( 3 + ( RAND( ) * 8 ) ), 2, 0 ) ) 表示 3号到10号的随机数据 */ 
  7.      
  8.     SET aDate = CONCAT
  9.         1949 + FLOOR( ( RAND( ) * 70 ) ), 
  10.         '-', 
  11.         LPAD( FLOOR( 1 + ( RAND( ) * 12 ) ), 2, 0 ), 
  12.         '-', 
  13.         LPAD( FLOOR( 3 + ( RAND( ) * 8 ) ), 2, 0 )  
  14.     ); 
  15. RETURN aDate; 
  16. END; 

详解MySQL如何按表创建<span><span><span><i style=千万级的压测数据" src="http://p1.pstatp.com/large/pgc-image/80b27cacdcd84a749f35acaecc805e8d" width="640" height="409">

关于LPAD函数,具体做为月份和日期的补零作用!生效如下介绍:

  1. Returns the string str:str, left-padded with the string padstr to a length of len characters.  
  2. If str is longer than len:N, the return value is shortened to len characters. 
  3. mysql> SELECT LPAD('hi',4,'??'); 
  4. -> '??hi' 
  5. mysql> SELECT LPAD('hi',1,'??'); 
  6. -> 'h' 

(2) DATETIME类型

在刚刚写好的randDate上进行改造:

  1. CREATE DEFINER = `root` @`%` FUNCTION `randDateTime` ( ) RETURNS VARCHAR ( 255 ) CHARSET utf8 BEGIN 
  2.     DECLARE 
  3.         aDateTime CHAR ( 19 ) DEFAULT ''; 
  4.      
  5.     SET aDateTime = CONCAT
  6.         CONCAT( 
  7.             1949 + FLOOR( ( RAND( ) * 70 ) ), 
  8.             '-', 
  9.             LPAD( FLOOR( 1 + ( RAND( ) * 12 ) ), 2, 0 ), 
  10.             '-', 
  11.             LPAD( FLOOR( 3 + ( RAND( ) * 8 ) ), 2, 0 )  
  12.         ), 
  13.         ' ', 
  14.         CONCAT( 
  15.             LPAD( FLOOR( 0 + ( RAND( ) * 23 ) ), 2, 0 ), 
  16.             ':', 
  17.             LPAD( FLOOR( 0 + ( RAND( ) * 60 ) ), 2, 0 ), 
  18.             ':', 
  19.             LPAD( FLOOR( 0 + ( RAND( ) * 60 ) ), 2, 0 )  
  20.         )  
  21.     ); 
  22. RETURN aDateTime; 
  23. END; 

5. 将数据循环插入

定义将数据循环的存储过程:

  1. DELIMITER // 
  2. CREATE PROCEDURE insertUser ( )  
  3. BEGIN 
  4.     DECLARE 
  5.         num INT; 
  6.      
  7.     SET num = 1
  8.     WHILE 
  9.             num < 100000 DO 
  10.             INSERT INTO username ( uid,username, email, PASSWORD, birthday, gender, avatar ) 
  11.         VALUES 
  12.             ( num, 
  13.                 rand_string ( 15 ), 
  14.                 concat( rand_string ( 5 ), '@qq.com' ), 
  15.                 rand_string ( 32 ), 
  16.                 randDate ( ), 
  17.                 '男', 
  18.             NULL  
  19.             ); 
  20.          
  21.         SET numnum = num + 1; 
  22.          
  23.     END WHILE; 
  24.     commit; 
  25. END; 
  26. // 

调用存储过程:

  1. CALL insertUser; 
责任编辑:赵宁宁 来源: 今日头条
相关推荐

2018-07-30 14:40:01

MySQLSQL查询

2019-08-19 00:14:12

网络测试带宽网络流量

2019-12-13 11:51:34

技术AI云计算

2010-09-10 13:37:30

表分区SQL Server

2021-02-03 14:51:34

MySQL数据库压测工具

2021-03-05 13:30:51

MySQL数据库压测工具

2020-12-03 09:57:34

MySQL压测工具数据库

2017-10-31 09:43:31

2020-06-17 08:55:22

mysqlslapsysbenchMySQL

2018-07-26 14:50:00

数据库MySQL大表优化

2014-07-10 10:33:47

2014-11-25 11:37:17

压测 软件测试

2010-11-22 13:53:46

MySQL数据表

2022-11-25 18:49:11

云原生

2023-01-16 08:09:22

PulsarMQ

2020-08-06 08:00:51

数据分页优化

2019-09-22 21:34:59

数据库平滑变更表结构

2016-01-14 13:07:20

美团压测工具工具

2010-07-14 10:53:20

Web应用

2023-10-19 08:23:50

wrkOpenResty工具
点赞
收藏

51CTO技术栈公众号