分析查询语句 Explain

分析查询语句 Explain

  1. table: 查询的每一行记录都对应着一个单表(有可能有临时表,union去重)

  2. id:在一个大的查询语句中每个SELECT关键字都对应着一个唯一的id(查询优化器可能对涉及及子查询的语句进行重写,转变为多表查询的操作)
    a. id如果相同,可以认为是一组,从上往下顺序执行
    b. 在所有组中,id值越大,优先级越高,越先执行
    c. 一个id号码,表示一趟独立的查询,一个sql的查询趟数越少越好

  3. select_type: 对应那个查询的类型,确定小查询在整个大查询中扮演了一个什么角色。
    查询语句中不包含union或者子查询都是simple,连接查询也是simple
    union 最左边的就是primary
    后面的是union
    会多一条临时表,用来去重
    子查询:subquery,如果子查询中用到的主查询,就是dependent query
    from中有select 就是派生表,derived

  4. partition:数据在哪个分区

  5. type:访问方法

    1. 当表中只有一条记录,并且该表使用的存储引擎统计数据是精确的。比如是myisam或者memory,那么对该表的访问方法就是system
    2. 当我们根据主键或者唯一 二级索引与常数进行等值匹配时,对单表的访问是const
    3. 在连接查询的时候,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的。(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须是等值比较)。则对该被驱动表的访问方式是eq_ref
    4. 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法可能是ref(隐式转换会导致索引失效)
    5. 当通过普通的二级索引列与常量进行等值匹配,该索引值也可以为NULL时,来查询某个表,那么对该表的访问方法可能是ref or null
    6. 单表访问,在某些场景下可以使用union sort union 这几种索引合并的方式来执行查询,那么对该表的访问方法可能是index_merge
    7. 在这里插入图片描述
    8. 如果索引获取某些范围区间的记录,那么就可能使用到range访问方法
    9. 当我们可以使用索引覆盖,但需要扫描全部的索引记录是,该表的访问方法就是index
    10. 全表扫描 all
    11. 在这里插入图片描述

possible_keys/ keys

  1. possible_keys可能用到的索引
  2. keys 实际用到的索引

key_len

实际使用到的索引长度(字节数) 帮你检查是否充分的利用上了索引,值越大越好,主要针对联合索引

ref

当使用索引列等值查询的时候,与索引列进行等值匹配的对象信息

  1. 常数类型const
  2. 某个列
  3. 某个函数

rows

预估的需要读取的记录条数(越小越好)

filtered

某个表经过搜索条件过滤后,剩余记录 数的百分比。

索引失效

  1. 违反最左前缀原则
  2. 计算,函数,类型转换(自动或者手动)会导致索引失效
  3. 范围条件的右边的列失效
  4. 不等于<> != 索引失效
  5. is null 可以使用索引,is not null 无法使用索引 not like 也同样
  6. like 以通配符%开头,索引失效(alibaba:sql查询 严禁左模糊或全模糊)
  7. or前后出现非索引的列,索引失效,因为中间有一个没有索引,还是得全表扫描
  8. 数据库和表的字符集统一使用utf8mb4,一定要统一,如果转换就会索引失效

建议

  1. 对于单列索引,尽量选择针对当前query过旅行更好的索引
  2. 在选择组合索引的时候,当前query中过滤性最好的字段,在索引字段顺序中,位置越靠前越好
  3. 在选择组合索引的时候,尽量选择能够包含当前query中的where子句中更多字段的索引
  4. 在选择组合索引的时候,如果某个字段可能出现范围查询,尽量把这个字段放在索引次序的最后面。
  5. 总之尽量避免造成索引失效的情况

关联查询优化

  1. 左外连接
  2. 内连接
    1. 对于内连接来讲,如果表的连接条件中,只有一个字段有索引,则有索引的字段会被作为被驱动表。
    2. 在两个表的连接都存在索引的情况下,会选择小表,作为驱动表(小表驱动大表)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值