看原始的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>);
标签:分页,查询,ID,id,post,优化,discuss,SELECT,300000 From: https://www.cnblogs.com/yaocy/p/16966404.htmlUSING关键字相当于ON