我们知道每条SQL语句,MySQL都会经过成本和规则的优化,对这个SQL选中对应的一些访问方法和顺序,包括做一些特殊的改写确保执行效率是最优的,然后优化过后,就会得到一个执行计划。
所谓的执行计划,落实到底层,无非是先访问哪个表,用哪个索引还是全表扫描,拿到数据之后如何去聚簇索引回表,是否要基于临时磁盘文件做分组聚合或者排序。
平时我们只要用类似于:explain select * from table,这种SQL前面加一个explain命令,就可以轻松拿到这个SQL语句的执行计划。比如:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra
|±—±------------±------±-----------±-----±--------------±-----±--------±-----±-----±---------±---------------+|
1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |
所谓的id、select_type、table、partitions、type之类的东西了吗,其实这些就是所谓的执行计划:
- id:每个select都会对应一个id,一个复杂的SQL里可能会有多个SELECT,也可能会包含多条执行计划,每一条执行计划都会有唯一的id
- select_type:就是这一条执行计划对应的查询是个什么类型
- table :表名,表示要查询哪个表
- partitions :表分区
- type:这个比较关键,表示针对这个表的访问非法,比如const、ref、range、index、all