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

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

查看所有标签

猜你喜欢:

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

云经济学

云经济学

乔·韦曼 (Joe Weinman) / 人民邮电出版社 / 2014-7-1 / CNY 75.00

在云计算日益成熟的今天,“接入而非拥有”的理念不断为人们所理解和接受。 《云经济学》阐述了“云经济学”不是经济理论中深奥的数学模型,而是技术革命的生动概括。“灵活的云计算能够有效提升企业的商业价值”则是本书的核心理念。 《云经济学——企业云计算战略与布局》从商业、金融及经济的视角解释了云经济的潜在原理,并通过易于理解的案例阐述了云计算是如何创造出综合价值的。无论你是供应商、零售商、服务......一起来看看 《云经济学》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具