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
猜你喜欢
- function annotation 写法:使用冒号 : 加类型代表参数类型默认值参数示例:b: int = 2使用&
- 1. 单行导入与多行导入在 Go 语言中,一个包可包含多个 .go 文件(这些文件必须得在同一级文件夹中),只要这些 .go 文件的头部都使
- 一段时间以来,发现有很多人XHTML都不会用,不光是普通的初学者,有的程序员都不是很清楚该怎么写这个XHTML,我这里呢算是把一些常见的应用
- 如下所示:import collectionsclass Mydict(collections.UserDict):def __missin
- 1.安装step1step 2 首先是更改安装地址,推荐安装在D盘,如果和我一样C盘容量大的话,也可以不改,直接点击【Next】😄step3
- 刚刚解决了这个问题,现在记录下来问题描述当使用lambda层加入自定义的函数后,训练没有bug,载入保存模型则显示Nonetype has
- async官方DOC介绍node安装npm install async --save使用var async = require('a
- 如何使用MsChart?MsChart是微软出品的一款功能强大的制作图表工具,用它可以很方便的建立各种图表。下面我们举例来说明:submit
- Pycharm的下方工具栏中有两个窗口:Python Console和Terminal(如下图)其中,Python Console叫做Pyt
- 整理了一些JS的常用方法,包括验证啊,全选反选啊,ajax请求啊之类的,因为就是自己用的,写的都比较简单,就算抛砖引玉吧,喜欢的就拿去,不喜
- 随着互联网的普及和发展,越来越多的人开始关注个人博客。个人博客是一个非常好的平台,可以让人们分享自己的知识和经验,也可以让人们交流和互动。在
- 一、利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码:$urlToEnco
- 前言:通常我们创建类都是使用class 类名,但是小伙伴们有没有想过,类是由谁来创建的呢,python中常说的万物皆对象,对象是由类创建的,
- 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如:>>>
- 脚本过于简单,供学习和参考。主要了解一下smtplib库的使用和超时机制的实现。使用signal.alarm实现超时机制。#!/usr/bi
- Oracle基本PLSQL的使用实例详解PL/SQL 块是在 SQL 语言之上发展起来的一种应用,可以集中的处理各种复杂的 SQL 操 作。
- 本篇文章主要内容代理类主要功能是将一个类实例的属性访问和控制代理到代码内部另外一个实例类,将想对外公布的属性的访问和控制权交给代理类来操作,
- Selenium简介Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界
- 源码解读Bootstrap按钮按钮组按钮组和下拉菜单组件一样,需要依赖于bootstrap.js。使用“btn-group”的容器,把多个按
- import numpy as npimport pandas as pdimport matplotlib.pylab as pltif