【Mysql深入理解系列2】执行计划

执行计划

分析sql执行数据
explain

语法:
explain ${sql}

1
2
explain extended select * from (select * from film where id = 1) tmp;
show warnings;

TYPE 类型:

  1. SYSTEM:查询的整张表只有1个 select (select 1 from)

  2. const:查询的结果跟const有的比。select 1 from

  3. eq_ref:使用的唯一索引,效率仅次于 const

  4. ref:普通索引,可能查出多条。或者唯一索引的部分前缀。联合索引等。

  5. range:索引查出了范围集。

以上都是走索引。

优化的方向

  1. index:全索引扫描。尽量优化。

  2. ALL:全聚簇索引扫描。

索引选择有优化,有的全表扫描效率更高就不选择索引。

如果结果集二级索引和主键索引全包含的情况下:
有主键索引也有二级索引,会优先索引二级索引。主键索引比较大。

  • key_len

组合索引(联合索引),说明用到了多长的索引。

key_len计算规则:

  1. 字符串
    char(n) :字节长短
    varchar(n): 3n+2。 +2存储字符串长度。
  2. 数值类型
    tinyint:1字节。
    smallint:2字节。
    int:4字节。
    bigint: 8字节。
  3. 时间类型
    date: 3字节
    timestamp:4字节

extra

  1. Using index说明
    查询的结果集在索引里,不用回表。
  • 覆盖索引
    一种查找方式,结果集在一颗索引树里。不用回表。
  1. Using where
    使用了where但是没有被索引覆盖。
  2. Using index condition
    查询的列不完全被索引覆盖,where条件中是一个前导列的范围。
  3. Using templrary,Using index
    Using templrary 使用了临时表。

查询语句有distint但是没有走索引的话,会在内存里建立临时表去重。如果有走索引的话,会在所以查询的时候直接进行distinc去重。变成

  1. Using fileSort

查询里有order by。但是没有建立索引。
如果有建索引会变成 Using index。因为索引已经是排好序了。

将用外部排序二不是所以你排序,数据较小时从内存排序。否则需要在磁盘完成。
6. select tables optimized away
有max,min查询。使用了索引。

  • like查询

like ‘ts%’ 会使用索引
like ‘%ts’ 不会使用索引。但是可以优化成全覆盖索引

  • 原则:
    少用or

因为or一次就是扫描一次。or多次可能比全表扫还慢。

  • 范围查找优化

select * from employee where age > 10 and age < 1000
可能不走索引,印为mysql判断后可能全表扫描会比较快。

索引总结表

图片

like kk%相当于=常量,%kk和%kk%相当于范围。