MySQL-Explain执行计划

通过使用EXPLAIN关键字,可以模拟优化器执行SQL查询语句的过程,从而了解MySQL是如何处理SQL的。
EXPLAIN帮助我们查看查询语句的执行计划,了解查询的具体执行过程。
下面详细分析EXPLAIN语句的使用和执行计划:

执行计划提供了查询的多个关键信息,包括:

表的读取顺序、操作数据读取操作的类型可用索引实际使用的索引表之间的引用优化器查询的每个表的行数

执行计划的语法很简单,只需在SQL查询前添加EXPLAIN关键字即可。
EXPLAIN后面是要分析的SQL语句。

执行计划包含以下列:

id:分配给每个SELECT关键字的唯一IDselect_type:SELECT关键字对应的查询类型table:表名partitions:匹配的分区信息(通常是为NULL)type:单表访问方式(如system、const、eq_ref等)possible_keys:可能的索引Key:实际使用的索引key_len:使用的索引记录的最大长度ref:等值匹配的对象信息索引列和常量行之间:估计需要读取的记录数过滤:按搜索条件过滤后表的剩余部分占记录数的百分比额外:附加信息

每个SELECT关键字对应一个唯一的ID。
对于包含子查询的查询,每个SELECT关键字也会有一个相应的ID。
查询优化器可以重写包含子查询的查询并将其转换为连接查询。
可以通过执行计划查看是否进行了重写。

在包含UNION子句的查询中,每个SELECT关键字还对应一个ID值。
UNION子句创建一个内部临时表来合并结果集。
UNIONALL不需要去重,所以执行计划中不存在ID为NULL的记录。

对于每种表访问方法,EXPLAIN输出的每条记录都对应于一种表访问类型。
访问类型从最好到最差是system、const、eq_ref、ref、range、index和ALL。
一般来说,您应该确保查询至少达到范围级别,最好达到引用级别。

系统访问方式用于表中只有一条记录的查询,例如MyISAM或Memory存储引擎。

采用const访问方式,根据主键或唯一二级索引列和常量进行等价匹配,查找速度快。

eq_ref访问方法用于连接查询。
驱动表通过主键或唯一二级索引列的值匹配来访问从动表。

ref访问方式通过普通二级索引列和常量的等价匹配来查询表,这是一种混合索引访问。

范围访问方式是利用索引来获取特定范围内的记录,适用于Between、<、>、in等查询。

索引access方法用于索引覆盖率查询,需要扫描所有索引记录。

all访问方式表示全表扫描。

possible_keys和key列分别代表查询中可能使用的索引和实际使用的索引。
key_len列显示使用索引时记录的最大长度。

行列表示预期需要扫描的行数,过滤列预测满足其他搜索条件的记录的百分比。

额外的列提供了额外的信息来帮助理解MySQL如何执行查询。

MySQL执行计划

我们知道,当执行一条SQL查询语句时,服务层的优化器会生成一个“查询执行计划”。
使用explain关键字可以查询执行的SQL查询语句,从而了解MySQL是如何处理SQL的,即SQL执行计划。
因此,根据执行计划,我们可以选择更好的索引并编写更优化的查询语句,并分析我们的查询语句或表结构的性能瓶颈。

首先解释一下上面执行计划中各列的含义:

3.UNION:UNIONLECT语句中的第二个或下一个SE;

4.UNIONRESULT:UNION的结果;

5.SUBQUERY:子查询中的第一个SELECT;

6.DERIVED:从表中导出SELECT(FROM子查询)。

、in等范围查询;6.index:索引连接类型与ALL相同,但只跨越索引树7.ALL:扫描整个表以查找匹配行。
相比于索引,ALL需要扫描磁盘数据,索引值需要遍历索引树。

误区:

从上图可以看出,key_len值为9(即hotelID(4)+dateTime(5)),并没有使用所有共享索引。
下面是对以下sql语句的改进:

目前key_len的值为14(即hotelID(4)+dateTime(5)+dateTime(5)),并且key_len中的所有索引键被使用。

优化前:

显然,从执行计划的解释我们可以看出该SQL语句使用了两个索引,但是从我们自己的优化目标来看,我们只需要使用IDX_DataChange_CreateTime即可索引就足够了这是我们通过几个小方面影响优化器得到的优化计划: