mysql limit 分页问题分析

来源:互联网 发布:c语言发送post请求 编辑:程序博客网 时间:2024/06/05 15:45

在mysql 深入浅出中看到如此优化
一张图片
想了N久都没想出order by 对 limit 的影响
比如 : explain select film_id from film limit 10 ,1 ;
rows = 1000(全表扫描)
但是 explain select film_id from film order by rows limit 10,1;
rows = 11 ;
(flim_id为主键)
今天偶然之中看到一个解释:
引擎先对film_id列的索引进行从小到大排序并限定了偏移量与索引节点的数量(偏移的节点也要算入其中,共要选定55个,还没智能到直接找到特定的那5个节点)。再根据选定的索引节点(第1个到第55个)指向数据库表中相应的行进行匹配。运用这种方式不会进行全表扫描,磁盘IO低,且时间效率也会比直接LIMIT的方式高。

这里写图片描述
这里写图片描述
如上为测试,果然合理
那么 ,对于有索引的,需要注意limit的偏移量
而对于没有索引的,一个优化方法是“LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,你需增加order by,并且order by字段需要建立索引。”
首字母不是index
20 | 0.03394100 | select id , ‘首字母’ from car_config_2016_3_6 limit 1 offset 19000
创建首字母index
24 | 0.00806900 | select id , ‘首字母’ from car_config_2016_3_6 limit 1 offset 19000

原创粉丝点击