IT修炼手册之SQL explain

Explain
分析 SQL 的利器。

Id(重要)

SQL 查询中,表示执行 Select 子句或者操作表的顺序

Id 相同:执行顺序从上到下

Id 不同:如果是子查询,id 序号会递增,id 越大优先级越高,越先被执行。

Id 相同不同同时存在,满足上面的情况。

查询类型

SIMPLE:查询中不包含子查询或者 UNION

PRIMARY:若包含子查询部分,最外层查询则 被标记为primary;

SUBQUERY:在 SELECT 或 WHERE 列表中包含了子查询,该子查询被标记为:SUBQUERY

DERIVED:在 FROM 列表中包含的子查询被标记为:DERIVED(衍生)用来表示包含在 from 子句中的子查询的 select。mysql 会递归执行并将结果放到一个临时表中。服务器内部称为”派生表”,因为该临时表是从子查询中派生出来的

UNION:若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION;若 UNION 包含在 FROM子句的子查询中,外层 SELECT 将被标记为:DERIVED UNION RESULT:从 UNION 表获取结果的 SELECT 被标记为:UNION RESULT

Type(重要)

常见的类型以及性能最好到最次:system>const >eq_ref >ref >range>index>all。一般来说得保证查询至少达到 range 级别,最好能到 ref 级别。
(1)、ALL:Full Table Scan, MySQL 将遍历全表以找到匹配的行
(2)、index:Full Index Scan,index 与 ALL 区别为 index 类型只遍历索引树,通常比 all 快,索引文件比数据文件小。
(3)、range:索引范围扫描 ,对索引的扫描开始于某一点,返回匹配值域的行。显而易见的索引范围扫描是带有 between 或者 where 子句里带有<, >查询。当 mysql 使用索引去查找一系列值时,例如 IN()和 OR 列表,也会显示 range(范围扫描),当然性能上面是有差异的。
(4)、ref:使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行
(5)、eq_ref:类似 ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用 primary key 或者 unique key 作为关联条件
(6)、 const、system:当 MySQL 对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于 where 列表中,MySQL 就能将该查询转换为一个常量。System 通常不会出现,因为表只有一行数据的时候才会出现。
possible_keys 和key(重要)

possible_keys:表示这次查询可能会用到的索引列,一般会是一个或多个

Key:实际用到的索引列,如果为空表示没用到索引

Key_len

显示的值为索引字段最大可能长度,并非实际长度,越少越好,但是越少越不精确。

Ref

显示索引的哪一列被使用了。显示格式:库.表.字段,索引类型(type).

rows(重要)

根据表统计信息以及索引选用情况,大致估算出找到所需的记录应该需要读取的行数。 越少越好。
Extra(重要)

重要的额外信息。

Using index:表示使用了覆盖索引,不用再次去访问数据行。存在效率高Using where: 表明使用乐 where 过滤
Using filesort 表示排序的时候没有用到索引,使用的文件内排序,出现这个会影响性能。Using temporary 使用了临时表,需要创建、插入数据、删除临时表性能大幅度下降,常见分组和排序中
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。

processlist
show processlist 获取 sql 时的进程执行状态,status 以下值得注意

converting HEAP to MyISAM 查询结果太大时,把结果放在磁盘

create tmp table 创建临时表(如 group 时储存中间结果)

Copying to tmp table on disk 把内存临时表复制到磁盘

locked 被其他查询锁住

logging slow query 记录慢查询

Profiles
show profiles 查看一个 sql 语句执行的过程;

如果查询第二个语句执行的过程

Mysql 架构

1.最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于 SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2.第二层架构主要完成大多少的核心服务功能,如 SQL 接口,并完成缓存的查询,SQL 的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。 在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是 select 语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
3.存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选 取。
4.数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交

猜你喜欢

转载自blog.csdn.net/qq_37779333/article/details/81517141