MySQL生成千万测试数据以及遇到的问题


Posted in MySQL onAugust 05, 2022

1、创建基础表结构

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;

2、创建内存表

直接往实表添加数据比较慢,所以我们先插入内存表,然后再同步到实表。

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;

3、创建存储过程和函数

# 创建随机字符串
delimiter $$
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 $$ 
# 创建随机时间的函数,sd和ed两个入参代表生成的时间是这个时间范围内的。sd开始时间,ed截止时间。	
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 $$ 

# 创建插入数据存储过程
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 ),
				randDataTime ( "2020-01-01", "2021-01-01" ));
		

		SET i = i + 1;
		
	END WHILE;

END $$
delimiter ;

4、执行存储过程

存储过程当中的数字就是要生成的数量,自行填写。

CALL add_t_user_memory(10);

100万大概需要8分钟!

MySQL生成千万测试数据以及遇到的问题

5、遇到的问题

创建存储过程和执行的时候可能会出现以下两种问题:

5.1、1449错误

在创建存储过程的时候可能会出现1449:错误:

mysql 1449 : The user specified as a definer (‘root’@‘%’) does not exist

经查询是权限问题,解决办法:

运行sql:

grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

5.2、1114错误

当生成数量大的时候就可能会报这个错误:

MySQL生成千万测试数据以及遇到的问题

解决方法:在my.cnf中修改max_heap_table_size = 256M tmp_table_size = 256M,重启MySQL服务(my.cnf在mysql安装路径),如果还不够用根据自己电脑自行修改。如果是线上服务器,最好不要自行修改,还是跟运维多沟通沟通,避免出现问题。

MySQL生成千万测试数据以及遇到的问题

show VARIABLES like '%TABLE_size%';

改完可以在这进行查看:

MySQL生成千万测试数据以及遇到的问题

6、同步数据

INSERT INTO t_user SELECT * FROM t_user_memory;

总结

到此这篇关于MySQL生成千万测试数据以及遇到的问题的文章就介绍到这了,更多相关MySQL生成千万测试数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL 用户权限管理
Apr 20 MySQL
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL 分页查询的优化技巧
May 12 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
详解MySQL中的主键与事务
May 27 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
面试官问我Mysql的存储引擎了解多少
MySQL索引失效场景及解决方案
Jul 23 #MySQL
MySQL添加索引特点及优化问题
Jul 23 #MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 #MySQL
MySQL分布式恢复进阶
Jul 23 #MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 #MySQL
MySQL池化框架学习接池自定义
Jul 23 #MySQL
You might like
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
详解参数传递四种形式
2015/07/21 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
基于Python实现文件大小输出
2016/01/11 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
python发送邮件脚本
2018/05/22 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
Numpy之random函数使用学习
2019/01/29 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
领导党性分析材料
2014/02/15 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
英文辞职信范文
2015/05/13 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python