1.Explain执行计划——SQL优化神器
用法:
EXPLAIN SELECT * FROM pms_category WHERE parent_cid=0
运行结果:
通过在SQL语句前面加上explain关键字,执行后并不会真正的执行sql语句本身,而是通过explain 工具来分析当前这条SQL语句的性能细节:比如是什么样的查询类型、可能用到的索引及实际用到 的索引,和一些额外的信息。
2.各字段的解释(重要字段)
1)select_type列
-
derived:
第一条执行的sql是from后面的子查询,该子查询只要在from后面,就会生成一张衍生表,因此他的查询类型:derived
-
subquery:
在select之后 from之前的子查询
-
primary:
最外部的select
-
simple:
不包含子查询的简单的查询
-
union:
使用union进行的联合查询的类型
2)table列
当前查询正在查哪张表
3)type列
type列可以直观的判断出当前的sql语句的性能。type里的取值和性能的优劣顺序如下:
null > system > const > eq_ref > ref > range > index > all
对于SQL优化来说,要尽量保证type列的值是属于range及以上级别。
4)id列
在多个select中,id越大越先执行,如果id相同。上面的先执行。
5)possible keys列
这一次的查询可能会用到的索引。也就是说mysql内部优化器会进行判断,如果这一次查询走索引的性能比全表扫描的性能要查,那么内部优化器就让此次查询进行全表扫描——这样的判断依据我们可以通过trace工具来查看
6)key列
实际该sql语句使用的索引
7)rows列
该sql语句可能要查询的数据条数
8)key_len列
计算规则:
- 字符串
1. char(n): n字节长度
2. varchar(n): 2字节存储字符串长度,如果是utf-8,则长度3n + 2
- 数值类型
1. tinyint: 1字节
2. smallint: 2字节
3. int: 4字节
4. bigint: 8字节
- 时间类型
1. date: 3字节
2. timestamp: 4字节
3. datetime: 8字节
如果字段允许为NULL,需要1字节记录是否为NULL
索引最大长度是768字节,当字符串过长时, mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引
9)ref列
显示该表的索引字段关联了哪张表的哪个字段
10)extra列
extra列提供了额外的信息,是能够帮助我们判断当前sql的是否使用了覆盖索引、文件排序、使用了索引进行查询条件等等的信息。