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. 第一式、单例模式-Singleton模式(创建型)

    一.简介 单例模式主要用的作用是用于保证程序运行中某个类只有一个实例,并提供一个全局入口点.单例模式(Singleton)为GOF阐述的标准24种设计模式中最简单的一个.但随着时间推移,GOF所阐述的 ...

  2. mysql查询类型转换问题

    mysql转换类型.类型转换.查询结果类型转换 一.问题来源 数据库一张表的主键id设为了自增,那就是int型的,但是其他表的关联字段又设置成了字符串! 而且已经开发了很久才发现问题,既然出现了问题肯 ...

  3. Linux中$的特殊用法

     一:变量说明:($表示在执行命令的一些参数)   (!)    $!      #Shell最后运行的后台Process的PID  (2)    $?      #最后运行的命令的结束代码(返回值) ...

  4. kali 源文件 更改和使用 更新日期:2018.04.21

    我的公众号,正在建设中,欢迎关注: 0x01 源文件格式: kali下常用的更新命令有: apt-get install update和apt-get install upgrade,update是下 ...

  5. Storm 学习之路(六)—— Storm项目三种打包方式对比分析

    一.简介 在将Storm Topology提交到服务器集群运行时,需要先将项目进行打包.本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明.主要打包方式有以下三种: 第一种:不加任何插 ...

  6. 如何做一个大数据seo人员

    作为流量运营者或者SEO人员,对于所从事行业领域的认识往往建立在一种直觉之上,我们很难对一个行业有一个全面的了解,这个行业领域有多宽,流量聚焦在哪里,那些是用户最关心的问题? 有的时候很难准确的把握, ...

  7. 监控redis的操作命令

    查看redis客户端的操作记录,即~/.rediscli_history. ls /home/*/.rediscli* 但是看不到代码操作redis的记录,只是redis-cli的记录.可以用moni ...

  8. Java中的反射(1)

    Reflection in Java 反射到底是什么呢,我被问到的时候其实也没办法很好的回答这个问题,翻一翻博客,然后逐条讲解.今天干脆就整合一下,免得以后还要去翻. 首先讲一下Java是如何在运行时 ...

  9. JavaScript 词法作用域不完全指北

    在 JavaScript 作用域不完全指北 中,我们介绍了作用域的概念以及 JavaScript 引擎.编译器和作用域的关系.作用域有两种主要的工作模型:词法作用域和动态作用域.其中最为普遍的也是大多 ...

  10. django基础知识之中间件:

    中间件 是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中 每个中间件 ...