分页查询优化

看原始的SQL语句

SELECT * FROM `discuss_post` limit 300000,5

另外可以看到这里并没有走索引

比如这里会查询前300005条数据,然后丢掉前面的300000条数据

对于ID自增

可以利用主键索引

SELECT * FROM `discuss_post` where id> 300000 limit 5

性能提升还是比较明显

可以看到是走了主键索引,涉及的行数也大幅下降

SELECT * FROM `discuss_post` where id between 300000 and 300005

用BETWEEN也是差不多的效果,他俩本质上没有区别
BETWEEN是包含边界条件的,所以这里查出来会比上面多一条

但是这两种方式也有明显的弊端,要求ID为递增数字而且中间不能有断裂

limit ID

SELECT * FROM `discuss_post` where id >(SELECT id from `discuss_post` LIMIT 300000,1) limit 5

虽然仍然有大量丢弃,但是只查了ID字段,所以查询和丢弃的数据其实已经少了很多

效率可以做到和上面差不多,但是没有了对ID字段的限制,不要求是递增的数字,也不要求没有断裂

内层不走主键索引,但是外层走

延迟关联

SELECT * FROM `discuss_post`JOIN (SELECT id from `discuss_post` LIMIT 300000,5) as x USING(id)

模板是这样的

SELECT <cols> FROM profiles JOIN(
SELECT <primary key cols> FROM profiles
WHERE ... LIMIT 1000000,5
)AS x USING(<primary key cols>);

USING关键字相当于ON

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16966404.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(34)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起