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的执行速度也不是很理想的,这种时候感觉要控制多表连接的表的数量,尽量以小表连大表,并且可以考虑在表中加一些冗余的字段,来做表关联,还不行的话,可以考虑数据异构或专门写个'索引'表。
关于学习到的一些记录与知识总结