schedual定时任务执行报错 explain执行计划详解( 三 )

mysql> explain select * from t1 join (select distinct a from t2) as derived_t2 on t1.a=derived_t2.a;---- ------------- ------------ ------------ ------- --------------- ------------- --------- ---------------- ------ ---------- ------------- | id | select_type | table| partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra| ---- ------------- ------------ ------------ ------- --------------- ------------- --------- ---------------- ------ ---------- ------------- |1 | PRIMARY| t1| NULL| ALL| a| NULL| NULL| NULL|100 |100.00 | Using where ||1 | PRIMARY| | NULL| ref||| 5| join_test.t1.a |10 |100.00 | Using index ||2 | DERIVED| t2| NULL| index | a| a| 5| NULL| 1000 |100.00 | Using index | ---- ------------- ------------ ------------ ------- --------------- ------------- --------- ---------------- ------ ---------- ------------- 关于子查询和派生表的优化策略,可具体查看对应的文章:MySQL 子查询优化、SQL 优化:derived 派生表优化 。
typetype 显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到 range 级别,最好能达到 ref 。
1. system
当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如 MyISAM、Memory,那么对该表的访问方法就是 system:
mysql>explain select * from t_myisam; ---- ------------- ---------- ------------ -------- --------------- ------ --------- ------ ------ ---------- ------- | id | select_type | table| partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra | ---- ------------- ---------- ------------ -------- --------------- ------ --------- ------ ------ ---------- ------- |1 | SIMPLE| t_myisam | NULL| system | NULL| NULL | NULL| NULL |1 |100.00 | NULL| ---- ------------- ---------- ------------ -------- --------------- ------ --------- ------ ------ ---------- ------- InnoDB 表即使只有一行,也不是 system,而是 ALL:
mysql> explain select * from t5;---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- ------- | id | select_type | table | partitions | type | possible_keys | key| key_len | ref| rows | filtered | Extra | ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- ------- |1 | SIMPLE| t5| NULL| ALL| NULL| NULL | NULL| NULL |1 |100.00 | NULL| ---- ------------- ------- ------------ ------ --------------- ------ --------- ------ ------ ---------- ------- 2. const
根据主键或者唯一二级索引列与单个常数进行等值匹配时(不能有多个条件用 or 连接,这属于范围查询),对单表的访问方法就是 const,举例:
mysql> explain select * from t1 where id=100; ---- ------------- ------- ------------ ------- --------------- --------- --------- ------- ------ ---------- ------- | id | select_type | table | partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra | ---- ------------- ------- ------------ ------- --------------- --------- --------- ------- ------ ---------- ------- |1 | SIMPLE| t1| NULL| const | PRIMARY| PRIMARY | 4| const |1 |100.00 | NULL| ---- ------------- ------- ------------ ------- --------------- --------- --------- ------- ------ ---------- ------- 3. eq_ref
在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是 eq_ref,举例:
mysql> explain select * from t1 join t2 on t1.id=t2.id where t1.a<50; ---- ------------- ------- ------------ -------- --------------- --------- --------- ------------ ------ ---------- ------------- | id | select_type | table | partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra| ---- ------------- ------- ------------ -------- --------------- --------- --------- ------------ ------ ---------- ------------- |1 | SIMPLE| t2| NULL| ALL| PRIMARY| NULL| NULL| NULL|1 |100.00 | NULL||1 | SIMPLE| t1| NULL| eq_ref | PRIMARY,a| PRIMARY | 4| hucq.t2.id |1 |5.00 | Using where | ---- ------------- ------- ------------ -------- --------------- --------- --------- ------------ ------ ---------- -------------

推荐阅读