MySQL如何快速创建800w条测试数据表
作者:涛姐涛哥 发布时间:2024-01-19 09:27:28
一、数据插入思路
如果一条一条插入普通表的话,效率太低下,但内存表插入速度是很快的,可以先建立一张内存表,插入数据后,在导入到普通表中。
1、创建内存表
View Code
2、创建普通表
普通表参数设置和内存表相同,否则从内存表往普通标导入数据会报错。
View Code
3、创建存储函数
产生伪随机码user_id
要用到存储函数。
View Code
4、创建存储过程
存储过程是保存起来的可以接受和返回用户提供的参数的Transact-SQL 语句的集合,可以创建一个过程供永久使用。
View Code
5、调用存储过程
call 就是调用存储过程或者函数,这里调用存储过程1000000次
CALL add_vote_memory(1000000)
6、导入数据
将内存表中的数据导入普通表。
INSERT into vote_record SELECT * from vote_record_memory
7、内存不足
如果报错内存满了,报错信息如下:
CALL add_vote_memory(1000000)
> 1114 - The table 'vote_record_memory' is full
> 时间: 74.61s
则可以使用命令查看内存表和临时表允许写入的最大值:
show variables like '%%table_size%'
MySQL默认16M:
修改默认内存配置:
set session tmp_table_size=1024*1024*1024;
set session max_heap_table_size=1024*1024*1024;
配置修改后,再执行上述调用存储过程和数据导入步骤。
8、查看结果
查看记录,是否有插入100W条数据。
select count(*) AS total from vote_record
9、插入800W条数据
测试插入800W条数据,call 调用存储过程800W次。
查看结果:
800W条测试数据插入OK,想插入多少条测试数据就调用n次存储过程,CALL add_vote_memory(n)。
二、MySQL深度分页
所谓的深度分页问题,涉及到mysql分页的原理。通常情况下,mysql的分页是这样写的:
select id, user_id, vote_id, group_id from vote_record limit 200, 10
SQL意思就是从vote_reccord 表里查200到210这10条数据即【201,210】,mysql会把前210条数据都查出来,抛弃前200条,返回10条。当分页所以深度不大的时候当然没问题,随着分页的深入,sql可能会变成这样:
select id, user_id, vote_id, group_id from vote_record limit 7999900, 10
这个时候,mysql会查出来7999920条数据,抛弃前7999900条,如此大的数据量,速度一定快不起来。
那如何解决呢?一般情况下,最简单的方式是增加一个条件,利用表的覆盖索引来加速分页查询:
select id, user_id, vote_id, group_id from vote_record where id > 7999900 limit 10
我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。
因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。上述vote_record 表的id字段是主键,自然就包含了默认的主键索引,这样,mysql会走主键索引,直接连接到7999900处,然后查出来10条数据。但是这个方式需要接口的调用方配合改造,把上次查询出来的最大id以参数的方式传给接口提供方,会有一定沟通成本。
1、测试深度分页
优化前,查询耗时2.362s,随着数据的增大耗时会更多,limit语句的查询时间与起始记录的位置成正比。
优化后,耗时0.012s,性能提升了196.8倍。
来源:https://www.cnblogs.com/taojietaoge/p/15726834.html


猜你喜欢
- 深入理解python try异常处理机制#python的try语句有两种风格#一:种是处理异常(try/except/else)#二:种是无
- 可以使用numpy中的linspace函数np.linspace(start, stop, num, endpoint, retstep,
- 1、要点 (1) 在C语言中没有字符串,只有字符, 在python中的字符串hello,在C
- 我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,
- etcd组件作为一个高可用强一致性的服务发现存储仓库.etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似
- asp正则表达式检测字符串是否是数字及字母。<% '函数:CheckString(strng) '
- 本文实例讲述了python将ip地址转换成整数的方法。分享给大家供大家参考。具体分析如下:有时候我们用数据库存储ip地址时可以将ip地址转换
- apply_async简介python在同一个线程中多次执行同一方法时,该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行
- 在日常工作中,除了需要从 JSON 转化为 Go 的数据结构。但往往相反的情况是:我们需要将数据以 JSON 字符串的形式发送到 Web 服
- 一、什么是变量在读这篇文章前,我们需要搞懂到底是什么变量,其实一句话就能概括:变量是一个可以保存任何数据类型值的命名占位符。本篇文章将会介绍
- 注:本文针对单个服务器上多块GPU的使用,不是多服务器多GPU的使用。在一些实验中,由于Batch_size的限制或者希望提高训练速度等原因
- 使用python编写了共六种图像增强算法:1)基于直方图均衡化2)基于拉普拉斯算子3)基于对数变换4)基于伽马变换5)限制对比度自适应直方图
- 贪吃蛇游戏是经典手机游戏,既简单又耐玩。通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分。在诺基亚时代,风靡整个手机界,今天我们来看看另类的,
- 其实网上有很多关于python2.6.6 升级到python2.7的文章,但是我对比这些类似的文章升级之后,发现其中有错误的地方,于是决定还
- 怎样才能将在表A取得的数据插入另一个表B中?(1)对于表A和表B两个表结构完全相同的话〔字段个数,相应字段的类型等等〕,可以使用 inser
- 前言CORS 即 Cross Origin Resource Sharing 跨域资源共享.跨域请求分两种:简单请求、复杂请求.简单请求简单
- 这篇文章主要介绍了java连接mysql数据库代码实例程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- SQL Server中一共提供了三个字符串截取函数:LEFT()、RIGHT()、SUBSTRING()。一、LEFT()函数函数说明如下:
- Tkinter复选框Checkbutton是否被选中判断定义一个BooleanVar型数据进行获取复选框状态。>>> im
- 前言DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,D