mysql explain 关键词分析mysql 语句
传统文化丢失严重啊,古代女子个个能呤诗作对,现代女子不行了 只会作对。
很多时间,在优化mysql 语句的时候,首先必须用到 关键字 explain 进行分析一下
例如:
EXPLAIN select * from pdvee_finance_order_cost WHERE subject_id = 1;
执行结果:
现在就让我们来一个个的分析,这些代表着什么意思
id 列
这是一个查询编号,编号越大表示该行数据优先执行,如果编号一样,则会从上往下依次执行(数据量少的优先先执行,mysql 内部机制)
select_type列
- SIMPLE(简单查询)
- PRIMARY(主查询)、SUBQUERY(子查询)
- DERIVED(派生查询)
- UNION(联合查询)、UNION RESULT(联合结果的查询)
- DEPENDENT SUBQUERY(依赖性子查询)
- UNCACHEABLE UNION(未被缓存的查询)
- DEPENDENT UNION(依赖性联合查询)
table列
查询的表
partitions列
表示分区
type列
查询SQL性能的核心,它显示了该SQL语句使用了哪种方式进行查询,粗略的来说,一共有7种,性能从好到差依次是: system、const、eq_ref、ref、range、index、all
- system 当表中只有一条数据,这种情况基本达不到,只是理想的情况。它是const类型的一个特例
- const 从表中通过常量且只查询出一条数据,并且这条数据是通过主键索引或者唯一索引来查询出来的
- eq_ref 唯一性索引,对于要查询的字段,只返回匹配唯一的一行数据,有且只能有一个(不能多个,也不能为0),经常出现在唯一索引和主键索引上
- ref 非唯一性索引,对于索引的查询,可以返回0个或多个
- range 执行索引查询的范围,使用between、>、<、in。需要注意的是,如果in后面的数据太多,使用in的话索引会失效,然后变成全表扫描,并且使用数字查询的时候一定要确保索引列的类型为int
- index 使用index表示从当前索引树(B+树)来进行查询,比全表扫描要好一些
- All 表示全表扫描,将表中的每一列都查了一遍,没有使用到索引,效率最低
possible_keys列
可能用的到索引,这一列显示理论上应该可能用到的索引有哪些,这个数量最好和select 后面查询的字段数量是一致的。如果使用了索引,但是没有出现在该列中,则说明该SQL使用的是覆盖索引。如果为null,表示没有用到索引。
key列
实际用到的索引
key_len列
所用的索引长度,也可以说是字节数, 在使用索引的前提下,该数值越小越好,数值越小,意味着设计表时,该字段的长度比较短,节省空间
ref列
表示用到了哪个表的哪个字段,如果该列值为const,表示使用了常量
rows列
通过索引查到的数据个数,表中可能有很多条,但是这里显示的只是根据索引查询出来的数据个数
filtered列
Extra列
包含不适合在其他列中显示但十分重要的额外信息