内容简介: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来说,相关的性能原理是一样的。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。