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 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
.
Mysql优化(出自官方文档) - 第三篇的更多相关文章
- Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)
目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...
- Mysql优化(出自官方文档) - 第二篇
Mysql优化(出自官方文档) - 第二篇 目录 Mysql优化(出自官方文档) - 第二篇 1 关于Nested Loop Join的相关知识 1.1 相关概念和算法 1.2 一些优化 1 关于Ne ...
- Mysql优化(出自官方文档) - 第一篇(SQL优化系列)
Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...
- Mysql优化(出自官方文档) - 第五篇
目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...
- Mysql优化(出自官方文档) - 第七篇
Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...
- Mysql优化(出自官方文档) - 第八篇(索引优化系列)
目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...
- Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)
Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 目录 Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods Row-Leve ...
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...
- Mysql优化(出自官方文档) - 第六篇
Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...
随机推荐
- 使用 docker 搭建 nginx+php-fpm 环境 (两个独立镜像)
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- Ural_1169_Pairs
此题略坑... 思路:把N个点分成m若干个联通子图,然后用m-1个桥把这m个联通子图连接起来即可. 若每个联通子图内部都是完全图也符合题意,但答案却是Wrong Answer,只有把每个联通子图内部当 ...
- 使用wait/notify实现线程间的通信
之前对Java多线程中的wait/notify机制理解都不是很清晰,最近看了一本技术书,通过里面的讲解再配上一些博客,终于算是对wait/notify有了进一步的理解. 下面就来说说我对这两个方法的认 ...
- Codeforces Round #563 (Div. 2)B
B.Ehab Is an Odd Person 题目链接:http://codeforces.com/contest/1174/problem/B 题目 You’re given an array a ...
- Mac安装MySQL-python报错解决
Mac安装MySQL-pyhton报错 今天在Mac上安装MySQL-python报错,搜遍网络都说什么mysql config路径问题,但是都不行. 解决方案 一开始遇到的问题是: Complete ...
- Linux实例/etc/fstab文件配置错误导致系统启动异常
Centos 7.3系统 问题现象: 阿里云ECS升级配置后重启,SSH连接不上.登录控制台远程连接ECS,出现以下界面. 提交工单阿里云反馈:https://help.aliyun.com/kno ...
- 1.谈谈对Java平台的理解
1.谈谈你对Java平台的理解 Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“一次编译,到处运行”(Compile once,run anywhere),能够非常容易地获取跨 ...
- hihoCoder 1312:搜索三·启发式搜索(A* + 康托展开)
题目链接 题意 中文题意 思路 做这题的前置技能学习 康托展开 这个东西我认为就是在排列组合问题上的Hash算法,可以压缩空间. A*搜索. 这里我使用了像k短路一样的做法,从最终状态倒回去预处理一遍 ...
- mysql 终端命令
1.打开数据库 /usr/local/MySQL/bin/mysql -u root -p 2.输入root密码 3.使用我的数据库 use mysql 4.查看表 desc table_name 5 ...
- scrapy实战5 POST方法抓取ajax动态页面(以慕课网APP为例子):
在手机端打开慕课网,fiddler查看如图注意圈起来的位置 经过分析只有画线的page在变化 上代码: items.py import scrapy class ImoocItem(scrapy.It ...