声明:本博客为本人的个人学习笔记,内容均由网上资源整理而来,若有内容错误,欢迎指正,若有侵权,立即删除。
limit 10000,20意味着扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行;问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。
方式一:游标方式
select * from table where id > last_id limit 20 order by reply_id ASC;
上面的last_id为本页最后一条记录的id,这样就能实现“下一页”的查询了,同理也可以实现“上一页”的查询。即查询上一个结果的之后20条。弊端在于只能连续查询,因为每次查询都是以上一页的最后数据作为游标的。
方式二:利用子查询,扫描索引
SELECT * FROM tableName
WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1)
LIMIT 2;
子查询走的是主键索引查询,比较快,子查询的结果类似于游标,查询游标之后的数据即可。
方式三:JOIN分页方式
SELECT * FROM
tableName AS t1
JOIN
(SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2
WHERE t1.id >= t2.id ORDER BY t1.id desc LIMIT 2;
子查询使用了主键索引,在缓存中进行一次查询即可,速度较快。而使用select * 方式一般不走索引。耗时较长,应当尽量减少select *次数。