mysql大数据limit优化实例详解

发布时间:2020-08-17编辑:脚本学堂
本文介绍了mysql大数据中有关limit优化的方法,使用limit每次取5w条数据,通过select distinct减少得到的数据量,有需要的朋友参考下。

mysql大数据limit优化

需求:
每日游戏日志表数据量由原来1w+增长到千万级别,原先获取数据方式:
select * from table
一次性取出的数据量太大导致内存溢出。
既然一次性取数据不行,那就分次处理~
 
1,使用limit每次取5w条数据
 

select * from table limit 0,50000
select * from table limit 50000,50000
...

重新跑代码,速度很慢,可能是处理数据耗时过长,数据表内有一大部分是此处无用的重复数据,从这入手~
 
2,根据项目情况通过select distinct减少得到的数据量
加上索引后速度不错,但是index_length大约是data_length的75%左右。
索引占了太大空间,只能另想他法。
 
发现一个奇怪现象:
 

select * from table limit 0,50000 #速度很快
select * from table limit 5000000,50000 #速度很慢

此表有自增id主键,所以使用where条件可以顺利解决~

3,通过where条件按自增id取数据
 

select * from table where id > 0 and id <= 50000
select * from table where id > 50000 and id <= 100000
...
 

但是还有一个模块需要使用其它查询条件,最终结果id不连续,得另想个办法。
 
基于:
 

select * from table limit 5000000,1 #速度相对较快
select * from table limit 5000000,50000 #速度很慢

4,先取第一条id 再通过id与limit取数据
 

select * from table where condition and id >= (select id from table whrer condition limit 5000000,1) limit 50000

速度提升,但不理想。
 
5,先通过子查询取出id 再通过id取数据
 

select * from table where id in (select id from (select id from table where condition limit 5000000,50000) as tmp)

先通过主键索引找出id,再通过id取数据,测试结果不理想,但是sql和子查询分开执行,速度ok。
 
6,拆分成两次执行 先取出id 再通过id取数据
 

select id from table where condition #先取出并处理id
select * from table where id in (5000001,5000002,5000003,...)

速度可以接受,使用其它条件不通过索引查询速度相对还会慢一些,模块内每个字段都可以作为组合查询条件,所以没加索引,在项目页面上增加先缩小数据范围再查询的提示,搞定。
 

您可能感兴趣的文章: