MySQL-explain篇

发布时间 2023-12-22 23:02:24作者: 轻寒

工具介绍

  • 模拟优化器执行SQL语句
  • 分析你的查询语句或是结构的性能瓶颈
  • 执行查询会返回执行计划的信息
  • from 中包含子查询,仍会执行该子查询,将结果放入临时表中

type

  • system:system是const的特例
  • const:读取一次
  • eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。
  • ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行
  • range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行
  • index:通常扫描二级索引,扫描全索引拿到结果
  • all:全表扫描,可以考虑通过增加索引进行优化

效率对比:system>const>eq_ref>ref>range>inex>ALL

1、system级别
A、只有一条数据的系统表
B、或衍生表只能有一条数据的主查询

很明显 实际开发当中 我们是不会只有一条数据的

2、const级别
仅仅能查出一条的SQL语句并且用于Primary key 或 unique索引;
SELECT * from shop where id=?
主键索引、唯一索引和unique索引达到这个级别,sql要根据公司的业务去写,这个情况也很难达到的。

3、eq_ref级别
唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多,不能0);

此种情况常见于唯一索引和主键索引;

4、ref级别

非唯一性索引:对于每个索引键的查询,返回匹配的所有行(可以是0,或多个)。

5、range级别
检索指定范围的行,查找一个范围内的数据,where后面是一个范围查询 (between,in,> < >=);
in有时有可能会失效,导致为ALL;

6、index级别
把索引的数据全查出来 就是这个级别了

7、ALL级别
不走索引,就是ALL级别。