分页查询优化
看原始的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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步