explain使用方法
影响SQL性能的原因
- 查询语句写的不好
- 索引失效
- 关联查询过多(join)
- 存储引擎
- 服务器调优以及参数设置
- 服务器硬件以及操作系统
MySQL常见的性能瓶颈
- CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘读取数据的时候
- IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
- 服务器硬件的性能瓶颈
explain是什么
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句。
explain能干什么
查看一下信息,用来解决查询语句写的不好这个问
- id:表的读取顺序
- select_type:数据读取操作的操作类型
- table:数据来源的表名
- partitions:查询访问的分区
- type:查询的类型
- possible_keys:可能会用到的索引
- key:实际使用的索引,查询中若使用了覆盖索引,则该索引仅出现在key列表中不会出现在possible列表中
- key_len:索引长度,越短越好
- ref:显示索引中被用到的列
- rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
- filtered:符合某条件的记录数百分比。(作用不大)
- Extra:一些其他的数据
explain怎么用
语法 :explain SQL语句
id
在id不同的时候执行由id从大到小执行,当id相同的时候则为由上至下执行.
select_type
数据读取操作的操作类型
- simple:简单的select查询,查询中部包含子查询或union
- primary:子查询中最后一个被加载的语句
- subquery:子查询
- union:将两表的结果相连的语句
- union result:从union表获取结果的select
explain select 测试.*,年龄.意义 from 寻觅的测试表 as 测试 inner join 寻觅的年龄连接表 as 年龄 on 测试.年龄=年龄.年龄 having 性别!='男';
explain select * from 寻觅的测试表 where 身高!=(select min(身高) from 寻觅的测试表 where 性别!='男') and 性别!=(select 性别 from 寻觅的测试表 where 性别='女' or 性别='保密');
explain select * from 寻觅的身高连接表 union select * from 寻觅的年龄连接表;
type
- system,表只有一行记录(等于系统表),这是const类型的特例
- const表示通过索引一次就找到了,const用于比较primary key
- eq_ref,唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配
- ref,非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行
- range,只检索给定范围的行,使用一个索引来选择行。
- index,Full Index Scan,index与ALL区别为index类型只遍历索引树。
- ALL,将遍历全表找到匹配的行
从好到坏的排序为
system > const > eq_ref > ref > range > index > ALL
Extra
额外的信息
- Using filesort,说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySQL中无法利用索引完成的排序操作称为"文件排序"
- Using temporary,使用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。
- Using index,使用了索引,避免了全表扫描
- Using where,使用了where过滤
- Using join buffer,使用了连接缓存
- impossible where,不可能的条件,where子句的值总是false