Mysql 超大分页处理

超大的分页一般从两个方向上来解决:

  • 从需求的角度减少这种请求,主要是不做类似的需求(直接跳转到几百万页之后的具体某一页,只允许逐页查看或者按照给定的路线走,这样可预测,可缓存),以及防止ID泄漏且连续被人恶意攻击。该方案下解决超大分页,其实主要是靠缓存,可预测性的提前查到内容,缓存至 redis 等 k-V 数据库中,直接返回即可。
  • 数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于 select * from table where age > 20 limit 1000000,10 这种查询其实也是有可以优化的余地的.。这条语句需要 load 1000000 数据然后基本上全部丢弃,只取10条当然比较慢.。我们可以修改为 select * from table where id in (select id from table where age > 20 limit 1000000,10)。这样虽然也 load 了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快.。同时如果ID连续的好,我们还可以select * from table where id > 1000000 limit 10,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少 load 的数据。

我们用第2种方案做一个对比试验:

  1. 先看看表里数据总条数,发现有45万条,做测试应该够用了。
    在这里插入图片描述
  2. 从40万条后,取20条,多次查询平均花费时间 0.55 秒。
    在这里插入图片描述
  3. 使用第2种方案优化后,多次查询平均花费时间 0.1 秒。
    在这里插入图片描述

结论:第2种优化方案查询速度提升了 5.5 倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值