MySQL快速生成本地测试数据
利用数据的存储过程生成测试数据:
我们可以通过数据库的的 INSERT 语句直接在存储过程中向普通数据表中添加数据,但是
当我们添加到百万数据后,往普通表插入测试数据的性能就会明显降低。所以在这里建议
使用内存表做一个中间铺垫,在内存表中生成完百万条数据后,在一次性的插入普通数据表
即可完成百万条测试数据生成。下面我们看过程:
第一步创建内存表:
CREATE TABLE `vote_record_memory` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR (20) NOT NULL,
`vote_id` INT (11) NOT NULL,
`group_id` INT (11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_id` (`user_id`) USING HASH
) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
第二步创建普通表:
CREATE TABLE `vote_record` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR (20) NOT NULL,
`vote_id` INT (11) NOT NULL,
`group_id` INT (11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_user_id` (`user_id`) USING HASH
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
注意:内存表和普通表的区别在与他们的存储引擎不同,在SQL代码中已用红色加粗标识。
在插入的过程中,为了让数据更接近真实性,我们创建一个随机参数的函数辅助数据的生成。
第三步创建随机生成函数:
DELIMITER //
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
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 //
第四步创建存储过程:
DELIMITER //
CREATE PROCEDURE `add_vote_memory`(n int,len int)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i <= n ) DO
INSERT into vote_record_memory(user_id,vote_id,group_id,create_time ) VALUEs (rand_string(len),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() );
set i=i+1;
END WHILE;
END //
第五步执行存储过程:生成 万条数据,user_id 长度 个字符, Mac 电脑运行 2 min 左右就可以跑完。
CALL add_vote_memory(1000000,20);
注意:在生成的过程共可能会出现内存不足或者溢出提示,需要设置 my.cnf 参数 max_heap_table_size
max_heap_table_size = 4096M
定义 max_heap_table_size 为 4G 的表示数据表在内存中的存储大小,保证足够的空间
存储数据,因为内存表会把表结构存放在磁盘上,把数据放在内存中
第六步查看内存表的数据条数:
select count(*) from vote_record_memory;
注意:如果条数没有达到你生成的条数,请再等一会或者刷新一下数据统计条数最终达到你要生成的册数条数,因为
数据量大会有一定的延时,以查最终出来的数据结果为准。
第七步将内存表的数据插入到普通表:1 min 左右就能完成。
INSERT into vote_record SELECT * from vote_record_memory;
第八步查看普通表的数据:
select count(*) from vote_record;
第九步删除内存表的数据:释放内存空间
delete from vote_record_memory;
到此就完成了。
MySQL快速生成本地测试数据的更多相关文章
- mysql快速生成批量测试数据
mysql快速生成批量测试数据 参考资料: https://blog.csdn.net/oahz4699092zhao/article/details/53332148 -- 创建一个临时内存表 ; ...
- MySQL快速生成100W条测试数据
https://blog.csdn.net/qq_16946803/article/details/81870174 1.生成思路利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生 ...
- mysql 快速生成百万条测试数据
1.生成思路 利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中 2.创建内存表及普通表 CREATE TABLE `vote_record_me ...
- MySQL快速生成连续整数
很多时候需要用到连续的id进行数据对比,如判断是否连续等问题.那么,生成连续整数的方式有多种,首先容易想到的是逐步循环,如果想生成1kw条记录,则需要循环1kw次进行插入,那么有没有其他方式呢,效率相 ...
- mysql 快速生成删除数据库中所有的表的语句
SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_s ...
- mysql快速生成truncate脚本清空数据库表记录
语句格式: select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABL ...
- MySQL快速创造百万测试数据
CREATE TABLE `vote_record_memory` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `user_id` VARCHAR (20) NO ...
- MySQL快速生产表的描述
# mysql快速生成表的描述 SELECT column_name AS `列名`, CONCAT_WS(' (', data_type, character_maximum_length) AS ...
- 【转】Oracle中如何用一条SQL快速生成10万条测试数据
转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...
随机推荐
- SharePoint 2013: The "New Web Application" button is disabled is the central administration
安装完sharepoint foundation2013后,直接通过url访问管理中心,想进application management去新建的话会发现新建按钮是灰色的,即使你用的是系统管理员账号并且 ...
- 视音频编解码学习工程:H.264分析器
=====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...
- 高通 MSM8K bootloader 之三: LK
- 理解WebKit和Chromium: Chromium网络栈
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 前面讲到Chromium的资源加载机制,在调用栈上,提到URLRequest之后就戛然而止,在这之下就是 ...
- Linux System Programming --Chapter Six
这一章的题目是--高级进程管理,这篇文章将以书中所叙的顺序进行讲解 1.让出处理器 Linux提供一个系统调用运行进程主动让出执行权:sched_yield.进程运行的好好的,为什么需要这个函数呢?有 ...
- 《java入门第一季》之面向对象
之前的代码描述都是基于面向过程的,今天开始正式进入面向对象的世界.什么是对象?首先要区分类和对象的概念-- 现实世界中是如何描述一个事物的? 举例:学生 姓名,年龄,性别... 学习,吃饭,睡觉 属性 ...
- ITU-T E.800 有关服务质量(QoS)的术语定义
摘要 ITU-T E.800建议书为服务质量(QoS)的研究和管理提供了一套通用术语.本建议书列出的与QoS相关的技术和非技术术语旨在代表电信市场所有各方(即用户.服务提供商.制造商和监管机构)的利益 ...
- SharePoint 2013 图文开发系列之入门教程
做了SharePoint有三年了,大家经常会问到,你的SharePoint是怎么学的,想想自己的水平,也不过是初级开发罢了.因为,SharePoint开发需要接触的东西太多了,Windows操作系统. ...
- android应用资源预编译,编译和打包全解析
我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件.这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的. ...
- ITU-T Technical Paper: QoS 的参数(非常的全,共计88个)
本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...