广信之家就本文中给大家带来优化MySql limit处理大数据量分页方法与实例详解,帮助朋友们参考学习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语句在处理大数量的高效率。