概述

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


1、准备测试表

CREATE TABLE `username` (`uid` INT( 11 ) UNSIGNED NOT NULL default 1235678901,`username` VARCHAR( 20 ) ,`email` VARCHAR( 30 ) ,`password` VARCHAR( 32 ) ,`birthday` date,`gender` VARCHAR(10) ,avatar MEDIUMBLOB,PRIMARY KEY ( `uid` )) ENGINE = INNODB DEFAULT CHARSET=utf8;

2、随机生成数据

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

RAND函数生成随机数:


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

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

SET GLOBAL log_bin_trust_function_creators = 1; CREATE DEFINER = `root` @`%` FUNCTION `rand_string` ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8 BEGINDECLAREchars_str VARCHAR ( 100 ) DEFAULT 'hwbtestABCDEFG23141HIJ6712dfghjkqwevbnqmwerqwerqwreqw214123e1214c12dssaf89';DECLAREreturn_str VARCHAR ( 255 ) DEFAULT '';DECLAREi INT DEFAULT 0;WHILEi < n DOSET return_str = concat( return_str, substring( chars_str, FLOOR( 1 + RAND( ) * 80 ), 1 ) );SET i = i + 1;END WHILE;RETURN return_str;END;

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

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


4、随机生成DATE和DATETIME类型

4.1、DATE类型

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

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

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

4.2、DATETIME类型
在刚刚写好的randDate上进行改造:

CREATE DEFINER = `root` @`%` FUNCTION `randDateTime` ( ) RETURNS VARCHAR ( 255 ) CHARSET utf8 BEGINDECLAREaDateTime CHAR ( 19 ) DEFAULT '';SET aDateTime = CONCAT(CONCAT(1949 + FLOOR( ( RAND( ) * 70 ) ),'-',LPAD( FLOOR( 1 + ( RAND( ) * 12 ) ), 2, 0 ),'-',LPAD( FLOOR( 3 + ( RAND( ) * 8 ) ), 2, 0 ) ),' ',CONCAT(LPAD( FLOOR( 0 + ( RAND( ) * 23 ) ), 2, 0 ),':',LPAD( FLOOR( 0 + ( RAND( ) * 60 ) ), 2, 0 ),':',LPAD( FLOOR( 0 + ( RAND( ) * 60 ) ), 2, 0 ) ) );RETURN aDateTime;END;

5、将数据循环插入

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

DELIMITER //CREATE PROCEDURE insertUser ( ) BEGINDECLAREnum INT;SET num = 1;WHILEnum < 100000 DOINSERT INTO username ( uid,username, email, PASSWORD, birthday, gender, avatar )VALUES( num,rand_string ( 15 ),concat( rand_string ( 5 ), '@qq.com' ),rand_string ( 32 ),randDate ( ),'男',NULL );SET num = num + 1;END WHILE;commit;END;//

调用存储过程:

 CALL insertUser;

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

mysql datetime 转date_详解MySQL如何按表创建千万级的压测数据相关推荐

  1. mysql如何进行压测_详解MySQL如何按表创建千万级的压测数据

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

  2. mysql function函数_详解MySQL如何按表创建千万级的压测数据

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

  3. mysql 日期比较_详解Mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: 代码如下 select * from product where add_time = '2 ...

  4. mysql inner join where_详解mysql 使用left join添加where条件的问题分析

    当前需求: 有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表都有isDel逻辑删除标志. 最开始的错误写法一: SEL ...

  5. mysql sql组合_详解mysql 组合查询

    使用UNION 多数SQL查询都只包含一个或多个表中返回数据的单条SELECT语句.MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回.这些组合查询通常称为并(uni ...

  6. java mysql 自动提交_详解MySQL与Spring的自动提交(autocommit)

    1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效 ...

  7. mysql 事务 for update,mysql事务锁_详解mysql 锁表 for update

    摘要 腾兴网为您分享:详解mysql 锁表 for update,智慧农业,真还赚,悦读小说,学习帮等软件知识,以及电池管家,三国群英传3,userland,运满满货主版,王者荣耀,简单3d动画,嘉丽 ...

  8. mysql重做日志_详解MySQL 重做日志(redo log)与回滚日志(undo logo)

    前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更 ...

  9. mysql 设置 server id_详解Mysql存储引擎

    1.libmysql相关API介绍 MYSQL *mysql_init(MYSQL *mysql) 函数功能:分配或初始化MYSQL对象,若mysql是NULL,将分配,初始化,并返回新对象.否则,直 ...

最新文章

  1. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
  2. Delphi RTC
  3. php数据接口api安全,API接口数据安全之授权码sign
  4. android gsensor 坐标,MTK Android G sensor 原理,配置,调试
  5. VS2013常用设置和其他
  6. python编程基础—正则表达式
  7. SNW2010中国大会 ZDNet现场报道
  8. 个人博客系统功能介绍
  9. 在字节实习8个月后,成功转正
  10. 2行Python给图片加水印,太强了!
  11. MySQL调优(二)——索引最佳实践
  12. 家用路由器与企业路由器有什么区别
  13. Stream操作666
  14. 梦想经不起等待 -- 美文转载
  15. 【OpenIM原创】uni-app使用之 初始化会话 消息 好友 监听器
  16. 如何使用 ABAP 代码发送带有 PDF 附件的电子邮件
  17. 星起航跨境—亚马逊发展现状及未来趋势分析
  18. iFixit拆Galaxy Fold发现异物易入侵机内
  19. 一起设计一个Android倒计时组件
  20. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第28讲:PHP数组

热门文章

  1. C#动态生成html页
  2. Java单元测试(Junit+Mock+代码覆盖率)
  3. Django在根据models生成数据库表时报 missing 1 required positional argument on_delete(亲测)
  4. php 慢查询日志设置查看
  5. SocketLog-微信调试、API调试和AJAX的调试的工具,能将日志通过WebSocket输出到Chrome浏览器的console中
  6. Git多个commit合并成一个【中间提交合并 尾部提交合并】
  7. ELK报错hese locations are not writable or multiple nodes were started without inc
  8. 反思拖延症:持续告诉自己立即做立即做;面对困难时要持续坚持;面对困顿时要转变方法
  9. 反思项目调试整体过程
  10. Yii的各种query