实例详解mysql limit大数据量分页优化的方法

发布时间:2020-10-30编辑:脚本学堂
本文介绍下,mysql查询中的limit语句在处理大数量所分页时的优化方法,有需要的朋友参考学习下。

mysql的limit给分页带来了很大方便,但数据量一大时,limit的性能就急剧下降。
例如,取10条数据:
 

复制代码 代码示例:
select * from yanxue8_visit limit 10000,10
select * from yanxue8_visit limit 0,10
 

这二个sql语句在执行性能上,绝不是一个数量级别的。

关于mysql limit的优化,这里贴出一段文字:
对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。
根据它的数据,明显要好于直接使用limit。

这里我们使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 Mysql 5.0.19)
1、offset比较小时。 
 

复制代码 代码示例:
select * from yanxue8_visit limit 10,10
#多次运行,时间保持在0.0004-0.0005之间
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10
#多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
 

结论:
偏移offset较小时,直接使用limit较优。
这个很显然是子查询的原因。

2、offset大时。
 

复制代码 代码示例:
select * from yanxue8_visit limit 10000,10
#多次运行,时间保持在0.0187左右
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10
 

多次运行,时间保持在0.0061左右,只有前者的1/3。
可以预计offset越大,后者越优。
以后再写limit语句时要注意了,好好优化下Mysql。
 
据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id
是逐渐,vtype是tinyint,vtype是索引。

这是一个基本的新闻系统的简单模型。
现在往里面填充数据,填充10万篇新闻。
最后collect 为 10万条记录,数据库教程表占用硬盘1.6G。OK ,看下面这条sql语句:
select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK。

再来看这条语句:
select id,title from collect limit 90000,10;
从9万条开始分页,结果8-9秒完成,性能严重的差啊。

可以这样优化:
select id from collect order by id limit 90000,10; 很快,0.04秒就OK。
使用id主键做索引,速度没得说。

改进后的方法:
 

复制代码 代码示例:
select id,title from collect where id>=(select id from collect order by id
limit 90000,1) limit 10; 
 

这条语句依然是用了id做索引的结果。

您可能感兴趣的文章:
mysql limit用法及优化详解
学习MySQL数据分页查询(limit用法)
mysql查询优化之limit和count的优化
mysql优化之LIMIT,OFFSET分页
优化mysql的limit offset的例子
学习mysql中的limit分页优化
mysql的limit offset,n的奥秘

相关阅读
MySQL海量数据的通用存储过程分页代码
学习MySQL数据分页查询(limit用法)
mysql优化之LIMIT,OFFSET分页
学习mysql中的limit分页优化
mysql分页limit速度太慢