解决sql语句中分页limit,越来越慢的问题

声明:本博客为本人的个人学习笔记,内容均由网上资源整理而来,若有内容错误,欢迎指正,若有侵权,立即删除。

  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 *次数。

参考:
你知道MySQL的Limit有性能问题吗.
MySQL Limit 性能优化及分页数据性能优化.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值