mysql翻页性能相关原理

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

内容简介: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来说,相关的性能原理是一样的。

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

查看所有标签

猜你喜欢:

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

Head First Design Patterns

Head First Design Patterns

Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99

You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具