Mysql优化(出自官方文档) - 第三篇
目录
- Mysql优化(出自官方文档) - 第三篇
- 1 Multi-Range Read Optimization(MRR)
- 2 Block Nested-Loop(BNL) and Batched Key Access Joins(BKA)
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 join
,BKA
可以大大提高table scanning
的性能。
Join Buffer Management for Block Nested-Loop and Batched Key Access Algorithms
在
Mysql
中,Join buffer
分为regular buffer
和incremental buffer
,regular
可以理解为我们通常理解的buffer
,incremental
则是建立在regular
的前提下,存储的部分列不是真正的数据,而是对上一个buffer
的引用。假设有一个场景,三表join,t1 join t2 join t3,Mysql
使用B1
作为t1
和t2
的join
临时结果,B2
作为和t3
的结果,那么通常来讲:B1
是一个regular buffer
,Mysql
会把t1
和t2
的匹配结果存储在B1
中,B1
中只会存储匹配到的行,不会有任何多余的行,并且,如果某一列是NULL
,Mysql
也不会为该列分配任何空间。B2
是一个incremental buffer
,Mysql
会把t3
中匹配的行存入到B2
中,然后再把B1
中t1
和t2
的链接存储到B2
中,这样子就避免了数据无意义的拷贝操作。
可以看到
incremental buffer
不是独立的,一般来讲,需要多个buffer
,第一个buffer
往往是regular buffer
,后面的buffer
才是incremental buffer
。Block Nested-Loop Algorithm for Outer Joins and Semijoins
当前的
Mysql BNL
算法已经支持outer join
和semi 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
oreq_ref
.
转载于:https://www.cnblogs.com/seancheer/p/11250284.html
Mysql优化(出自官方文档) - 第三篇相关推荐
- Unity 优化翻译官方文档(二) ------ 平台特定覆盖的纹理压缩格式
官方文档 : https://docs.unity3d.com/Manual/class-TextureImporterOverride.html 虽然Unity支持许多常见的图像格式作为导入纹理的源 ...
- 【goldengate】官方文档笔记三 Oracle GoldenGate 实时报表
这篇文档循序渐进的讲述了OGG在适时复制的几种配置方案.从最基本的配置开始讲起,逐渐加入新的进程,加入新的策略,配置也随之改变.下面从最基础的配置说起. 报表配置 一对一复制是OGG最基本的配置方案: ...
- Unity 优化翻译官方文档(三) ------ Animation Clips
动画剪辑是Unity动画中最小的组成部分.它们代表了一个孤立的运动,如RunLeft.跳转或爬行,并且可以以各种方式进行操作和组合,以产生生动的最终结果(参见动画状态机.动画控制器控制器或混合树).您 ...
- ESP32 官方文档(三)分区表
分区表分区表概述内置分区表创建自定义分区表名字字段类型字段子类型App 子类型数据子类型偏移量 & 大小标志生成二进制分区表MD5 校验和烧录分区表 分区表 概述 单个 ESP32 的 fla ...
- 看懂mysql执行计划--官方文档
原文地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 9.8.2 EXPLAIN Output Format The EXP ...
- Unity优化翻译官方文档(六) ------ CPU Usage Profiler
官网地址 : https://docs.unity3d.com/Manual/ProfilerCPU.html CPU使用分析器显示在您的游戏中花费的时间.当它被选中时,下窗格将显示所选帧的分层时间数 ...
- storm mysql trident_Apache Storm 官方文档 —— Trident 教程
Trident 是 Storm 的一种高度抽象的实时计算模型,它可以将高吞吐量(每秒百万级)数据输入.有状态的流式处理与低延时的分布式查询无缝结合起来.如果你了解 Pig 或者 Cascading 这 ...
- voltDB官方文档第三章翻译
序:本文章是自己再网上查看VoltDB相关资料的时候没有找到太好的学习资料,就前去官方网站上翻译了一部分,约束于个人英语能力有限.实际记录下来的翻译只有第三章. 注:文章翻译自voltDB官方提供的学 ...
- Flink官方文档学习(三):Standalone Cluster 集群部署
参考:https://www.t9vg.com/archives/478 转载于:https://www.cnblogs.com/fanta2000/p/11227172.html
- [WebApp开发]基础教程-Google官方文档-第四篇
文档内容 在Android Browser中使用控制台API 在WebView中使用控制台API 参考 调试 如果你是在为Android开发web应用,那么,你可以使用控制台(console)的Jav ...
最新文章
- 3.ELK 之elasticsearch CRUD
- Android Studio 点击运行总是debug
- Shell脚本之条件判断
- [Oracle 学习] Oracle中将查询语句执行结果导入文本文件
- 名校教授:把研究生扔到河里,游过去的就成为博士
- freebsd查询php5的版本,FreeBSD下查看各软件版本命令
- JAVA中.jsp模板文件AJAX异步请求 - 数据渲染问题
- linux定时器跑命令,linux下运行定时器(cron/centos/js脚本)
- Redmi Note10系列配LCD居中挖孔屏:5月26日正式发布
- php 上传word文件 源码,THINKPHP中word文档的上传与下载
- 爱搞事情:关于黑苹果Intel网卡驱动这件事
- oracle random函数用法,Oracle随机函数的用法
- 智能小车——循迹、避障小车(附详细代码)
- python2.4无线模块_使用nRF24L01模块进行无线射频通信
- 软件测试 | 状态迁移法
- R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)
- 前端周刊第56期:应接不暇的技术大会
- MATLAB数值分析学习笔记:线性最小二乘回归
- 抽35块树莓派新品单片机送给可爱的你们
- 2021数学建模国赛A题
热门文章
- Java多线程为什么使用while循环来调用wait方法
- oracle 循环块,Oracle语句块PL/SQL循环判断
- java使用btree_最新阿里、百度Java面试题(基础+框架+数据库+分布式+JVM+多线程)...
- MQTT服务器Mosquitto安装及使用
- php 打乱数组的顺序,php数组打乱顺序
- 图书馆学应掌握计算机知识,图书馆学专业基础知识点整理.doc
- canal与mysql高可用_canal 高可用介绍(4)
- 重庆计算机一级考试在线做,全国(重庆考区)计算机一级考试教程.doc
- 吞吐量越大越好吗_家用中央空调匹数越大越好吗?
- linux 内核挂起 ping,Linux内核安全详解 ping到死复活方法