Loading

MySql系列(三):SQL的explain分析

1、什么是Explain指令

Mysql提供分析sql执行计划的指令,我们可以通过它,判断sql语句是否用到了索引、查询的总数及结果的占比,以及一些相关的信息。

2、怎么用Explain指令

很简单,只需要在你的sql前加上explain指令,就可以得出sql的执行计划。

以下面这条sql为例:

EXPLAIN SELECT ticket.ticket_code FROM mkt_coupon_deliver_task_ticket ticket WHERE ticket.coupon_template_id = 130030 AND ticket.ticket_code = 'M6WGKCF6'

得出的结果:

3、Explain结果的分析

  • id: sql的执行序号,代表sql的执行顺序,从1开始,子查询的id会递增。
  • select_type: sql语句的类型
  • table: sql语句涉及的目标表
  • partitions: 匹配到的分区
  • type: 访问的类型,常见的有ALL(全表扫描)、index(只遍历索引树)、ref(匹配条件中有字段用到了索引)
  • possible_keys: 可能用到的索引
  • key: 实际用到索引
  • key_len: 用到索引的字节数
  • ref: 连接条件与索引的关系,const表示连接条件的常量用到了索引
  • rows: 总的结果集,结果有多少行
  • filtered: 可以简单看成实际结果与结果集行数的占比(这种说法是不太准确的)
  • Extra: 一些附加信息,Using index 使用索引、Using temporary 使用临时表、Using filesort 使用排序、Using whereing 使用全表扫描

4、总结

实际上,我个人觉得使用explain这条指令可以直观看出有没有使用索引,但实际对应业务上,复杂的多表关联查询也是有的,这种时候就算表连接的字段都加上索引,实际sql的执行速度也不是很理想的,这种时候感觉要控制多表连接的表的数量,尽量以小表连大表,并且可以考虑在表中加一些冗余的字段,来做表关联,还不行的话,可以考虑数据异构或专门写个'索引'表。

posted @ 2022-01-20 10:26  逝zxq  阅读(359)  评论(0编辑  收藏  举报