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.

Mysql优化(出自官方文档) - 第三篇的更多相关文章

  1. Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)

    目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...

  2. Mysql优化(出自官方文档) - 第二篇

    Mysql优化(出自官方文档) - 第二篇 目录 Mysql优化(出自官方文档) - 第二篇 1 关于Nested Loop Join的相关知识 1.1 相关概念和算法 1.2 一些优化 1 关于Ne ...

  3. Mysql优化(出自官方文档) - 第一篇(SQL优化系列)

    Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...

  4. Mysql优化(出自官方文档) - 第五篇

    目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...

  5. Mysql优化(出自官方文档) - 第七篇

    Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...

  6. Mysql优化(出自官方文档) - 第八篇(索引优化系列)

    目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...

  7. Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)

    Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 目录 Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods Row-Leve ...

  8. Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)

    Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...

  9. Mysql优化(出自官方文档) - 第六篇

    Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...

随机推荐

  1. 12 DOM操作的相关案例

    1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> <h ...

  2. mysql数据库之表关系

    外键 前戏之一对多关系 # 定义一张部门员工表id name gender dep_name dep_desc1 jason male 教学部 教书育人2 egon male 外交部 漂泊游荡3 ta ...

  3. Protoc Buffer 优化传输大小的一个细节

    Protoc Buffer 是我们比较常用的序列化框架,Protocol Buffer 序列化后的占空间小,传输高效,可以在不同编程语言以及平台之间传输.今天这篇文章主要介绍 Protocol Buf ...

  4. Angular2国际化

    使用angular-cli初始化项目: ng new my-project 使用npm安装ngx-translate模块 npm install --save @ngx-translate/core ...

  5. Python 爬虫从入门到进阶之路(十一)

    之前的文章我们介绍了一下 Xpath 模块,接下来我们就利用 Xpath 模块爬取<糗事百科>的糗事. 之前我们已经利用 re 模块爬取过一次糗百,我们只需要在其基础上做一些修改就可以了, ...

  6. kali Linux渗透测试技术详解

    kali Linux渗透测试技术详解 下载:https://pan.baidu.com/s/1g7dTFfzFRtPDmMiEsrZDkQ 提取码:p23d <Kali Linux渗透测试技术详 ...

  7. mac-VBox-Centos6.6安装增强功能

    1. 更新内核 yum update kernel 2.安装依赖包 yum install kernel-headers yum install kernel-devel yum install gc ...

  8. BZOJ 1001:[BeiJing2006]狼抓兔子(最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意:中文. 思路:很明显是最小割,转化为最大流做.一开始看那么多点,但还是试了一下,居然过了 ...

  9. 关于安装了git或者小乌龟(TortoiseGit)使用之后出现红色! 绿色√ 蓝色?的解决办法:

    在当前目录中新建文件保存为(删除git信息.bat)在其写入:for /r . %%a in (.) do @if exist "%%a\.git" rd /s /q " ...

  10. Java内存模型与内存结构

    Java内存模型 一.简介 Java内存模型(JMM)主要是为了规定线程和内存之间的一些关系:根据JMM的设计,系统存在一个主内存(Main Memory)和工作内存(Work Memory),Jav ...