即使使用覆盖索引和延迟连接,当你到达后面的页面时,结果也会变慢,尽管与传统的偏移/限制相比,它应该是最小的 。使用这些方法,你可以轻易地深入到数千页 。
更好的覆盖索引
这里的很多好处取决于拥有良好的覆盖索引,所以让我们稍微讨论一下 。一切都取决于您的数据和用户的使用模式,但是您可以采取一些措施来确保查询的最高命中率 。
这将主要与 MySQL 对话,因为那是我有经验的地方 。其他数据库中的情况可能会有所不同 。
大多数开发人员习惯于为单列添加索引 , 但没有什么能阻止您向多列添加索引 。事实上 , 如果您的目标是为昂贵的分页查询创建覆盖索引 , 您几乎肯定需要一个多列索引 。
当你试图为分页优化一个索引时,一定要把按列排序放在最后 。如果你的用户要按update_at排序,这应该是你复合索引中的最后一列 。
看看下面这个包括三列的索引 。
在MySQL中,复合索引是从左到右访问的 , 如果一个列缺失 , 或者在第一个范围条件之后 , MySQL会停止使用一个索引 。
MySQL 将能够在以下场景中使用该索引:
如果你跳过is_archived,MySQL将无法访问update_at,将不得不诉诸于没有该索引的排序 , 或者根本不使用该索引,所以要确保你有相应的计划 。
主键始终存在
在MySQL的InnoDB中 , 所有的索引都附加了主键 。这意味着(email)的索引实际上是(email , id)的索引,当涉及到覆盖索引和延迟连接时,这是相当重要的 。
查询select email from contacts order by id完全被email上的一个索引所覆盖,因为InnoDB将id附加到了该索引上 。
使用我们上面的综合例子,你可以看到这有什么好处 。
因为复合索引涵盖了is_deleted, is_archived, updated_at, 和(通过InnoDB的功能)id,整个查询可以仅由索引来满足 。
降序索引
大多数时候 , 用户都在寻找 "最新的 "项目,即最近更新或创建的项目 , 这可以通过按update_at DESC排序来满足 。
如果你知道你的用户主要是以降序的方式对他们的结果进行排序,那么特别将你的索引设为降序索引可能是有意义的 。
MySQL 8是第一个支持降序索引的MySQL版本 。
如果你在explain的Extra部分看到向后索引扫描,你也许可以配置一个更好的索引 。
前向索引扫描比后向扫描快~15%,所以你要按照你认为你的用户最常使用的顺序添加索引,并为少数使用情况承担惩罚 。
太阳底下无新事
这种使用偏移/限制分页与延迟连接和覆盖索引的方法并不是银弹 。
仅仅是递迟连接就可以让你的速度得到很好的提升 , 但是需要花一些额外的心思来设计正确的索引以获得最大的好处 。
有一种观点认为 , 递延连接应该是框架中默认的偏移offset/限制limit方法 , 而任何时候覆盖索引的出现都只是一种奖励 。我还没有在足够多的生产环境中测试过,所以还没有强烈主张这样做 。
使用MySQL的递延Join连接实现高效分页 - Aaron
Mysql使用limit深度分页优化 mysql使用select * limit offset, rows分页在深度分页mysql的分页怎么用的情况下 。性能急剧下降 。
limit用于数据的分页查询mysql的分页怎么用,当然也会用于数据的截取mysql的分页怎么用,下面是limit的用法:
1. 模仿百度、谷歌方案(前端业务控制)
类似于分段 。mysql的分页怎么用我们给每次只能翻100页、超过一百页的需要重新加载后面的100页 。这样就解决了每次加载数量数据大 速度慢的问题了
推荐阅读
- 书法直播运营职责,书法直播招聘
- 为什么直播间灯牌会黑,为什么直播间灯牌会黑呢
- 计算机毕业设计范文大全集,计算机专业 毕业设计
- 如何管理一个营销主管部门,营销管理的方式
- go语言适合入门学习吗 go语言 入门
- redis4.0内存,redis内存设置多少合适
- 包含python爬虫视频地址的词条
- 99棋牌单机游戏,99 棋牌
- pip命令linux pip命令无法运行