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

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

查看所有标签

猜你喜欢:

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

Masterminds of Programming

Masterminds of Programming

Federico Biancuzzi、Chromatic / O'Reilly Media / 2009-03-27 / USD 39.99

Description Masterminds of Programming features exclusive interviews with the creators of several historic and highly influential programming languages. Think along with Adin D. Falkoff (APL), Jame......一起来看看 《Masterminds of Programming》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具