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|
关于子查询和派生表的优化策略,可具体查看对应的文章: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 | ---- ------------- ------- ------------ -------- --------------- --------- --------- ------------ ------ ---------- -------------
推荐阅读
- Win10游戏全屏任务栏无法隐藏的三种解决方法
- 小编教你在oppoa3中打开全屏多任务的方法介绍。
- 小编分享车到哪APP发布任务的操作方法。
- iPhone手机快手任务中心在哪里
- 如何打开任务管理器 打开任务管理器方法
- 血盟荣耀荣誉之路是什么,传奇之路任务奖励
- 奥拉星怎么接任务,《奥拉星手游》晶石获取方法介绍
- 造梦3任务怎么做,我的深圳造梦记
- 天猫精灵怎么设置定时关机 天猫精灵怎样设置定时关机
- 崩坏3驱魔任务能刷什么碎片,每日驱魔选择建议