mysql翻页性能相关原理

栏目: 数据库 · 发布时间: 7年前

内容简介:mysql翻页性能相关原理

mysql数据量大的情况下,如果进行深度翻页会很慢很慢,下面我提供了相关的博客说明如何优化翻页性能。

首先,你应该了解mysql innodb的索引原理,可以通过这篇博客学习: Mysql覆盖索引

你应该重点关注几个知识点:

  • 辅助索引与主键索引的关系,分别存储了什么信息。
  • 索引文件(B+树)是分块存储的,单个索引项的大小影响单个块内的索引个数,间接影响了扫描的块数,关系到磁盘读取文件的次数和数据量(IO),从而最终引起性能产生差异。
  • 覆盖索引带来的优化以及原理。
  • 子查询很慢(尽量永远不要用),用临时表JOIN可以优化。

此后,这篇博客将告诉你关于 mysql 翻页性能的重要秘密:

MySQL ORDER BY / LIMIT performance: late row lookups

你应该重点关注这几个知识点:

  • limit n,m翻页语法是需要沿着索引逐项遍历抵达offset n的,因此n越大花费的时间越大。
  • 辅助索引的索引项通常比较小,只保存了index key与primary key的关系。而primary key(主键索引)的索引项包括了完整的行数据,遍历时涉及比较大的IO负担。
  • SQL 使用了辅助索引,并且符合覆盖索引(也就是索引中包含了select的所有列数据)的情况下,就可以避免对主键索引(row lookups)的二次查询,从而提升性能。
  • 当SQL使用了辅助索引,但不符合覆盖索引的情况下,mysql在遍历辅助索引时并不会将row lookups延迟到offset n之后开始,虽然延迟到offset n后再开始进行row lookups会性能很优,但是mysql的确没有这样实现。

优化的结论是:

  • 尽量使用辅助索引并保证索引覆盖,这样可以以最低的IO代价获得目标翻页的若干主键ID。
  • 如果希望通过一句SQL实现翻页,记得将上面子查询作为一个临时表与主索引进行INNER JOIN。 (千万不要用IN,因为IN的执行计划超乎想象的愚蠢,它会拿父查询的每一条记录去执行一次子查询,而不是先将子查询生成临时表,再与父查询进行匹配)
  • 对于select count来说,相关的性能原理是一样的。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创业维艰

创业维艰

本·霍洛维茨 Ben Horowitz / 杨晓红、钟莉婷 / 中信出版社 / 2015-2 / 49

本·霍洛维茨,硅谷顶级投资人,与网景之父马克·安德森联手合作18年,有着丰富的创业和管理经验。2009年创立风险投资公司A16Z,被外媒誉为“硅谷最牛的50个天使投资人”之一,先后在初期投资了Facebook、Twitter、Groupon、Skype,是诸多硅谷新贵的创业导师。 在《创业维艰》中,本·霍洛维茨从自己的创业经历讲起,以自己在硅谷近20余年的创业、管理和投资经验,对创业公司(尤......一起来看看 《创业维艰》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具