MySQL(2) Explain

1、概念
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈

2、使用
在 select 语句之前增加 explain 关键字 ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
在explain 语句后马上执行一条show warnings语句,会展示mysql对上面这条sql优化后的
语句,通过这个我们可以大概了解mysql给我们sql语句做的一些优化,但是不一定能执行

3、explain中列的含义
(1)id
id是select的编号,值越大执行优先级越高,如果相同,则从上往下执行,null最后执行
(2)select_type
simple 简单查询
primary 复杂查询中最外层的select
subquery 包含在select 中的子查询,不在from之后
derived 包含在from后面的子查询,mysql会将结果放在一个临时表(派生表)
(3)table
查询的表名称
(4)partitions
如果查询是基于分区表的话,会展示查询将要访问的分区
(5)type
访问的类型
1、NULL:比如select min(id) from table; 就是null,意思就是在优化阶段已经查询出来结果,不需要去真正执行所以比 select id from table order by id limit 1 快
2、system   是const的一个特例,衍生表中匹配的数据只有一条
3、const   mysql会将查询的条件优化为一个常量,用于primary key 或unique key的所在列与常数比较
表中只有一个匹配行,读取一次
4、eq_ref primary key 或 unique key 索引的所有部分被连接使用,最多只返回一条符合条件的记录
5、ref    相比eq_ref ,不使用唯一索引,不止于关联查询
6、range  使用索引但是条件是一个范围
7、index  使用全索引查询,一般覆盖索引
8、all    全表扫描

(6)possible_keys
可能用到的索引
(7)key
实际用到的索引
(8)key_len
用到索引里使用的字节数
key_len计算规则如下:
字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字
或字母占1个字节,一个汉字占3个字节
char(n):如果存汉字长度就是 3n 字节
varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为
varchar是变长字符串
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
时间类型
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索
引。
(9)ref
key列记录的索引中,表查询值所用到到列或者常量
(10)rows
预估读取的行数,不是结果集中的行数
(11)filtered
该列是一个百分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指
explain 中的id值比当前表id值小的表)。
(12)Extra
Using index
使用了覆盖索引
Using where
使用了where语句处理结果
Using index condition
where 条件中使用了索引,但是不是覆盖索引
Using temporary
使用了临时表
Using filesort
使用了外部排序,有可能是文件排序,如果数据量比较大,可能会磁盘排序
Select tables optimized away
使用某些聚合函数比如 max min

索引注意事项
1、遵循最左前缀原则
2、不要对索引列做函数操作
3、尽量覆盖索引
4、!=、 <>、 not in、 not exists、is null、 is not null 可能无法使用索引导致全表扫表
5、比较类型要匹配,防止隐式转换
6、or 或 in 不一定走索引
7、区分度低的字段不一定走索引
8、范围查询放后面,有时候可以优化为等值查询
9、like可以用覆盖索引优化
 

你可能感兴趣的:(mysql,数据库)