使用explain分析SQL性能 O_O 数据库优化

影响SQL性能的原因

  1. 查询语句写的不好
  2. 索引失效
  3. 关联查询过多(join)
  4. 存储引擎
  5. 服务器调优以及参数设置
  6. 服务器硬件以及操作系统

MySQL常见的性能瓶颈

  1. CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘读取数据的时候
  2. IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
  3. 服务器硬件的性能瓶颈

explain是什么

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句。

explain能干什么

查看一下信息,用来解决查询语句写的不好这个问
在这里插入图片描述

  1. id:表的读取顺序
  2. select_type:数据读取操作的操作类型
  3. table:数据来源的表名
  4. partitions:查询访问的分区
  5. type:查询的类型
  6. possible_keys:可能会用到的索引
  7. key:实际使用的索引,查询中若使用了覆盖索引,则该索引仅出现在key列表中不会出现在possible列表中
    在这里插入图片描述
  8. key_len:索引长度,越短越好
  9. ref:显示索引中被用到的列
  10. rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
  11. filtered:符合某条件的记录数百分比。(作用不大)
  12. Extra:一些其他的数据

explain怎么用

语法 :explain SQL语句

id

在id不同的时候执行由id从大到小执行,当id相同的时候则为由上至下执行.

select_type

数据读取操作的操作类型

  1. simple:简单的select查询,查询中部包含子查询或union
  2. primary:子查询中最后一个被加载的语句
  3. subquery:子查询
  4. union:将两表的结果相连的语句
  5. 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
发布了47 篇原创文章 · 获赞 23 · 访问量 3407

猜你喜欢

转载自blog.csdn.net/qq_39611230/article/details/103561582