初步理解MySQL(5.6)的执行计划

声明:以下均来自于MySQL英文手册5.6。

1.MySQL所有的join都是使用 nest-loop join 算法(嵌套循环算法)。

2.对于一组joins,MySQL的join算法会从第一个表读取一行,然后一直往后逐个表找匹配行,如果某一行能够从第一个表开始,之后每个表都能找到匹配的行,则输出该“大行”;然后原路返回到之前的表直到能找到一张中包含匹配行的表为止,然后继续向后面的每个表找匹配的行。

3.MySQL中索引的使用会被索引的cardinality所影响,cardinality就是基数,集合的势的意思,太低会导致索引被弃用,举个例子,如果向sex这种取值太单一的字段建立索引,该索引可能不会被使用,因为基数太小了。可以通过Analyze Table tbl_name,来分析表,更新表的统计数据(InnoDB,MyISAM一般会自动更新)。

4.

执行计划中各列的解释:

列名 解释 特殊说明
id select的标识符 select在查询中的序号,同序号就表明是一组,序号的组越大越先执行,越外层数值越小,如果是union结果则是NULL,同组的话按照从上到下的顺序执行。
select_type select类型 没有子查询或union时都是simple,否则会有primary和union之类的,这里要注意带有uncacheable的类型,表示无法缓存,外层行切换会导致重新计算该select
table 输出行的所属表 表名或<unionM,N>,<derivedN>,<subqueryN>
partitions 匹配的分区 涉及到表的分区
type join类型 第5点有详细说明
possible_keys 可能被选择的索引 用于查找行的索引,独立于执行顺序的,这意味着不一定会使用,只是可能
key 实际被选择的索引 可能会出现不在possible_keys的的key的情况,就是如果索引覆盖了被选择的列,即便该索引不能用于查找行,但也会使扫描更快,因此MySQL也会使用
key_len 被选择的键的长度 MySQL在多部分索引中使用的部分的长度,可能有多个值
ref 需要与索引比较的列 列或者常数
rows 估计要被检验的行数 InnoDB中不一定精确,只是一个估计值
filtered 被表的条件所过滤的行的百分比 估计
Extra 额外信息 内容太多,需要再查文档吧

5.type(join的类型):

system(表只有一行),

const(表最多只有一行匹配),

eq_ref(每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一种,特点是使用=,而且索引的所有部分都参与join且索引是主键或非空唯一键的索引),

ref(如果每次只匹配少数行,那就是比较好的一种,使用=或<=>,可以是左覆盖索引或非主键或非唯一键),

fulltext(全文搜索),

ref_or_null(与ref类似,但包括NULL),

index_merge(表示出现了索引合并优化,这个比较复杂,目前的理解是合并单表的范围索引扫描),

unique_subquery(把形如“select primary_key”的子查询替换),

index_subquery(把形如”select key_column“的子查询替换),

range(常数范围),

index(一种情况是索引覆盖的全表扫描,只需查索引(3中表格所指出的key的特例),另一种是),

all(全表扫描)。

6.评估查询性能可以通过计算磁盘寻址次数:

小表一般一次寻址可以读取一行,因为索引可能被缓存,

大表则可以通过下列公式:log(row_count) /log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) +1。

如果是写入的话,通常需要四次寻址,其中一次寻址是寻找插入新索引的地方,通常更新索引需要两次(B树插入新节点后调整的平均次数是两次?Why?统计学原理?),最后一次写入改行。

7.SELECT @@optimizer_switch;或show variables like ‘optimizer_switch‘;可以查看优化器的一些选项。

8.什么是执行计划:

The set of operations that the optimizer chooses to perform the most efficient query is called the “query execution plan”, also known as the EXPLAIN plan。

优化器为了最有效的执行查询而选择的一系列操作被称为执行计划。

时间: 2024-10-10 17:36:24

初步理解MySQL(5.6)的执行计划的相关文章

MySQL学习系列2--MySQL执行计划分析EXPLAIN

1.Explain语法 EXPLAIN SELECT -- 变体:   EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2.执行计划分析和实例 创建员工表Employee create table Employee ( ID int auto_increment, Ename varchar(32), Age int, Salary float, MID int, P

MySQL 索引管理与执行计划

原文:MySQL 索引管理与执行计划 1.1 索引的介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息. 索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构. 1.1.1 唯一索引 唯一索引是不允许其中任何两行具有相同索引值的索引.当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一

Mysql索引、explain执行计划

1.索引的使用场景 哪些情况使用索引: 1.主键自动建立唯一索引 2.频繁作为查询条件的字段应该创建索引 where 3.多表关联查询中,关联字段应该创建索引on两边都要创建索引 select * from user left join order on user.id = order.userid 4.查询中排序的字段,应该创建索引B + tree 有顺序 5.覆盖索引 好处是?不需要回表组合索引 user表 组合索引(name,age) select * from user -------

MySQL索引管理及执行计划

第1章 索引介绍: 索引是对数据库表中一列或者多了的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息,如果想按特定职员的姓名来查找,则与他在表中搜索所有的行相比,索引有助于更快的获取信息 索引的一个主要目的就是加快检索表中的数据的方法,既能协助信息搜索者尽快找到符合限制条件的记录ID的辅助数据结构 1.1 索引的类型介绍: btree:B+树索引    最为常用 hash:hash索引 fulltest:全文索引 rtree:r数索引 第2章 索引管理 2.1 B树索引的分类: 主

MySQL 优化sql explain执行计划详解

mysql explain执行计划详解 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个C:

mysql的索引和执行计划

一.mysql的索引 索引是帮助mysql高效获取数据的数据结构.本质:索引是数据结构 1:索引分类 普通索引:一个索引只包含单个列,一个表可以有多个单列索引. 唯一索引:索引列的值必须唯一 ,但允许有空值. 复合索引:一个索引包含多个列. 聚集索引:并不是一种单独的索引类型,而是一种数据存储方式.innodb磁盘存储,.ibd数据和索引放在一个文件夹下. 非聚集索引:不是聚集索引的,就是非聚集索引. 2:语法 查看索引        show index from table: 创建索引 cr

MySQL执行计划不准确 -概述

为毛 MySQL优化器的执行计划 好多时候都不准确,不是最优的呢(cpu+io)??? 因素太多了:: 存在information_schema的信息是定期刷新上去的,好多时候不是最真的,甚至相差好大(非高山峰时好好利用一下analyze table等): 现在一个企业有钱没地方花,买一大堆固态磁盘,碰巧非智能的MySQL不能很好滴跟上硬件优化的节奏,可能超过一部分的选择原理就不怎么准确了(这点相信其他数据库也是痛点吧); 环境因素/ 配置因素 等等 ... MySQL执行计划不准确 -概述,布

深入理解MySQL优化原理

说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必.因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用. MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图

Oracle SQL执行计划基线总结(SQL Plan Baseline)

一.基础概念 Oracle 11g开始,提供了一种新的固定执行计划的方法,即SQL plan baseline,中文名SQL执行计划基线(简称基线),可以认为是OUTLINE(大纲)或者SQL PROFILE的改进版本,基本上它的主要作用可以归纳为如下两个: 1.稳定给定SQL语句的执行计划,防止执行环境或对象统计信息等等因子的改变对SQL语句的执行计划产生影响! 2.减少数据库中出现SQL语句性能退化的概率,理论上不允许一条语句切换到一个比已经执行过的执行计划慢很多的新的执行计划上! 注意: