ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql优化(出自官方文档) - 第三篇

2019-07-26 14:55:12  阅读:319  来源: 互联网

标签:第三篇 join BKA buffer MRR 索引 文档 Mysql


目录

Mysql优化(出自官方文档) - 第三篇

1 Multi-Range Read Optimization(MRR)

当使用二级索引进行多范围查找的时候,往往会导致对磁盘大量的随机访问,这就导致了局部性非常差,因此,Mysql在遇到这种场景的时候,首先会利用二级索引查找出所有的唯一索引,然后进行排序,在进行访问,这样子,就能大大的减少随机访问,众所周知,对于传统机械硬盘,顺序读的效率比随机读的效率要高很多。

需要注意的是:

  • MRR优化不支持创建在virtual generated columns上的二级索引,InnoDB支持virtual generated columns

  • 如果Mysql使用了这种优化,那么在EXPLAIN输出结果的Extra列会显示Using MRR
  • 如果查询的结果完全可以通过index产生(covering index, 覆盖索引:指部分列信息存储在索引里面)那么将不会使用MRR

2 Block Nested-Loop(BNL) and Batched Key Access Joins(BKA)

BKA算法可用于对joined table的索引访问和join buffer,BKA支持inner join, outer join, semijoin,以及nested outer joinBKA可以大大提高table scanning的性能。

  • Join Buffer Management for Block Nested-Loop and Batched Key Access Algorithms

    Mysql中,Join buffer分为regular bufferincremental bufferregular可以理解为我们通常理解的bufferincremental则是建立在regular的前提下,存储的部分列不是真正的数据,而是对上一个buffer的引用。假设有一个场景,三表join,t1 join t2 join t3,Mysql使用B1作为t1t2join临时结果,B2作为和t3的结果,那么通常来讲:

    • B1是一个regular bufferMysql会把t1t2的匹配结果存储在B1中,B1中只会存储匹配到的行,不会有任何多余的行,并且,如果某一列是NULLMysql也不会为该列分配任何空间。
    • B2是一个incremental bufferMysql会把t3中匹配的行存入到B2中,然后再把B1t1t2的链接存储到B2中,这样子就避免了数据无意义的拷贝操作。

    可以看到incremental buffer不是独立的,一般来讲,需要多个buffer,第一个buffer往往是regular buffer,后面的buffer才是incremental buffer

  • Block Nested-Loop Algorithm for Outer Joins and Semijoins

    当前的Mysql BNL算法已经支持outer joinsemi join了,当join操作发生在join buffer上的时候,通过将row放到buffer里面会同时放入一个match flag,表示join的匹配情况。

    如果Mysql使用了BNL,那么将会在EXPLAIN中体现如下,在Extra列,结果为: Using join buffer (Block Nested Loop) , 在Type列,为: ALL, index, 或者range.

  • Batched Key Access Joins

    BKA通常用在有索引访问的第二个join上,在BNL join算法中,当第一个join使用join buffer产生了多个列,此时BKA会把第一个join结果的多个key批量发给MRR(第一节)接口,MRR engine会使用更优化的方式进行table scan,可以大大提升效率。

    EXPLAIN中,如果使用BKA,那么Extra列的结果为:Using join buffer (Batched Key Access)type列的结果为:ref or eq_ref.

标签:第三篇,join,BKA,buffer,MRR,索引,文档,Mysql
来源: https://www.cnblogs.com/seancheer/p/11250284.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有