执行计划
分析sql执行数据
explain
语法:
explain ${sql}
1 | explain extended select * from (select * from film where id = 1) tmp; |
TYPE 类型:
SYSTEM:查询的整张表只有1个 select (select 1 from)
const:查询的结果跟const有的比。select 1 from
eq_ref:使用的唯一索引,效率仅次于 const
ref:普通索引,可能查出多条。或者唯一索引的部分前缀。联合索引等。
range:索引查出了范围集。
以上都是走索引。
优化的方向
index:全索引扫描。尽量优化。
ALL:全聚簇索引扫描。
索引选择有优化,有的全表扫描效率更高就不选择索引。
如果结果集二级索引和主键索引全包含的情况下:
有主键索引也有二级索引,会优先索引二级索引。主键索引比较大。
- key_len
组合索引(联合索引),说明用到了多长的索引。
key_len计算规则:
- 字符串
char(n) :字节长短
varchar(n): 3n+2。 +2存储字符串长度。 - 数值类型
tinyint:1字节。
smallint:2字节。
int:4字节。
bigint: 8字节。 - 时间类型
date: 3字节
timestamp:4字节
extra
- Using index说明
查询的结果集在索引里,不用回表。
- 覆盖索引
一种查找方式,结果集在一颗索引树里。不用回表。
- Using where
使用了where但是没有被索引覆盖。 - Using index condition
查询的列不完全被索引覆盖,where条件中是一个前导列的范围。 - Using templrary,Using index
Using templrary 使用了临时表。
查询语句有distint但是没有走索引的话,会在内存里建立临时表去重。如果有走索引的话,会在所以查询的时候直接进行distinc去重。变成
- 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%相当于范围。