mysql二亿大表_面对有2亿条数据的mysql表
看到这个2亿5千条数据的表,我的内心是拒绝的,各种条件筛选要取出相应的数据,被折磨了两天,现在记录下心路历程
先分享下mysql相关的知识点1 名词解释
主键(PRIMARY KEY): 唯一索引,不能重复
组合主键(UNIQUE): 组合索引,若干个字段组成一个主键2 SELECT必备 – EXPLAIN使用EXPLAIN来查看sql语句是否能命中索引,量大的表必须要命中索引才能执行,也还得看以下条件
(1) type
ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)(具体就不在这解释了)
(2) possible_keys
可能用到的索引,但不一定命中
(3) key
实际使用的key。想强制使用某个索引,可用FORCE INDEX。
(4) key_len
根据表定义计算而得的索引中使用的字节数,越短越好。
(5) rows
可能要读取的行数
(6) Extra (划重点)
Using Index: 表示使用索引,叫做覆盖索引,没有查询数据表,只查询了索引。如果同时出现Using Where代表可以用到索引,但是需要查询数据表。
Using where: 表示条件查询,不读取所有数据或者通过索引获取所需的数据。
Using filesort: 文件排序,无法利用索引的完成的排序操作
Using temporary: 需要使用临时表来存储结果集,常见于多表联合查询和排序如果出现Using filesort和Using temporary,尽量优化sql语句
开始操作这个2亿条数据的表1 命中联合主键
表中有若干个联合主键,就尽量往这些联合主键上靠了。EXPLAIN
SELECT *
FROM student
WHERE
class IN (1, 2, 3) AND
score > 90 AND
sex = 1
ORDER BY id DESC
LIMIT 0, 60idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEstudentrangeindex2, index3, index4, index5index244NULL642323Using index condition; Using filesort
可以命中联合主键索引,但rows特别多,执行非常慢,这个方案就pass了。2 命中联合主键进阶版
方案一中有些条件筛选命中联合主键速度还可以,但是加上ORDER BY time(time也是个索引)后就不行了。
主键id是时间加随机数,大体能满足排序,就改成了ORDER BY id,发现命中的索引还是联合主键。
对sql语句进行了如下修改:EXPLAIN
SELECT *
FROM student AS st1
LEFT JOIN student AS st2
ON st1.id = st2.id
WHERE
st1.class IN (1, 2, 3) AND
st1.score > 90 AND
st1.sex = 1
ORDER BY st1.id DESC
LIMIT 0, 60idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEst1rangeindex2, index3, index4, index5index244NULL642323Using where; Using index; Using filesort
1SIMPLEst2eq_refPRIMARYPRIMARY413800st.id1NULL
这样命中了联合主键和唯一主键,执行速度也很快,但是如果量比较大,改为st1.score > 60,就又不行了,第二个方案也pass。3 命中主键
方法总比困难多,最后只能往主键索引上靠了。先限定时间区间(可命中主键索引),能有效控制要筛选的数据量,再对时间区间内的数据筛选。EXPLAIN
SELECT *
FROM student
WHERE
(id LIKE '20180501%' OR id LIKE '20180502%' OR id LIKE '20180503%') AND
class IN (1, 2, 3) AND
score > 90 AND
sex = 1
ORDER BY id DESC
LIMIT 0, 60idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEstudentrangePRIMARY, index2, index3, index4, index5PRIMARY98NULL413800Using where
这样命中主键索引,Extra是Using where,执行速度也是相关快。某个条件筛选时Extra会有Using filesort,但执行速度挺快,就没管了。
总结
面对这样的mysql表只有命中主键索引啦。
mysql二亿大表_面对有2亿条数据的mysql表相关推荐
- 1亿条数据如何分表100张到Mysql数据库中(PHP)
来源:http://www.jb51.net/article/70265.htm 这篇文章主要介绍了当数据量猛增的时候如何把一亿条数据分表100张到Mysql数据库中,需要的朋友可以参考下 下面通过创 ...
- php 分表 实战,PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP)
<PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP)>要点: 本文介绍了PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP),希望对您有用.如果有疑问,可 ...
- mysql 5000万条数据库_1亿条数据如何分表100张到Mysql数据库中(PHP)
下面通过创建100张表来演示下1亿条数据的分表过程,具体请看下文代码. 当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过 ...
- 教你急速快速批量插入1000万条数据到mysql数据库表面试题
急速快速批量插入1000万条数据到mysql数据库表面试题 教你急速快速批量插入1000万条数据到mysql数据库表&面试题 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好 ...
- python操作数据表,循环造数100条数据
python操作数据表,循环造数100条数据, 包括number,varchar. ```sql --先建个临时表 CREATE TABLE tempdata_aa( c1 VARCHAR2(30), ...
- mysql导入亿级数据_如何将上亿条大容量数据导入MYSQL
我有一份数据量达到1,0015,0806条的csv文件,现在需要导入Mysql中. 在我电脑中安装的版本是MYSQL8.0.12,常见的管理工具有: 已知的有三种办法: 1.用图形管理工具Navica ...
- laravel mysql sum查询并排行_必看!PHP常见面试题——MySQL篇(二)
接上期:<必看!PHP常见面试题--MySQL篇(一)> 11.MySQL的默认事务隔离级别是? 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): ...
- mysql库垂按照模块_前任都能看懂的分库分表方案
我们都知道,随着业务量的增长,数据量也会随之增加,这个时候就需要关注业务大表,因为大表会影响查询性能,DDL变更时间很长,影响业务的可用性,同时导致从库延迟很大,如果业务做了读写分离,导致用户重复操作 ...
- mysql 1000万数据读取_插入1000万条数据到mysql数据库表
转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...
最新文章
- BoneCP 学习笔记
- python字典嵌套列表怎么访问值的某个元素_通过键列表访问嵌套字典项?
- python log函数_Python log10() 函数
- 阿里P8架构师谈:Docker简介、组成架构、使用步骤、以及生态产品
- android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述
- 知方可补不足~sqlserver中使用sp_who查看sql的进程
- 【华为云技术分享】云图说|应用编排服务AOS,助力应用上云自动化
- Word2vec之CBOW模型和Skip-gram模型形象解释
- 计算月份天数包括闰年二月天数计算
- 基于python的酒店管理系统_基于Web酒店管理系统的设计与实现
- java--------------
- sails框架条件查询
- 风火编程--opencv使用记事
- SPSS数据统计分析前准备【002期】
- 感恩中国30年,速速来看甲骨文数据库云大会
- 市值从100亿缩水到3亿仅用三年,转型的趣店无“底“可抄?
- 数字图像处理期末大作业 完成总结
- 猿学~Google I/O 最全记录,看完我们睡不着了!
- PowerDesign 16.5.5.2 (4734) 汉化包
- Windows下一键交换Esc和caps和一键恢复的方法