MySQL语句explain详解(5)

|  1 | SIMPLE      | t4    | ALL  | NULL              | NULL      | NULL    | NULL                | 1000 |      |

|  1 | SIMPLE      | t1    | ref  | PRIMARY,idx_id    | idx_id    | 4      | dbatest.t4.accountid |    1 |      |

+----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+

2 rows in set (0.00 sec)

(5).  ref_or_null

该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。

在下面的例子中,MySQL可以使用ref_or_null联接来处理ref_tables:

SELECT * FROM ref_table

WHERE key_column=expr OR key_column IS NULL;

(6). index_merge

该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。

例如:

mysql> explain select * from t4 where id=888 or accountid=31754306 ;

+----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+

| id | select_type | table | type        | possible_keys              | key                        | key_len | ref  | rows | Extra                                                |

+----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+

|  1 | SIMPLE      | t4    | index_merge | idx_t4_id,idx_t4_accountid | idx_t4_id,idx_t4_accountid | 4,4    | NULL |    2 | Using union(idx_t4_id,idx_t4_accountid); Using where |

+----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+

1 row in set (0.00 sec)

(7). unique_subquery

该类型替换了下面形式的IN子查询的ref:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。

(8).index_subquery

该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:

value IN (SELECT key_column FROM single_table WHERE some_expr)

(9).range

只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。

当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range

mysql> explain select * from t1 where id=888 or id=3952603 ;

+----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+

| id | select_type | table | type  | possible_keys    | key      | key_len | ref  | rows | Extra      |

+----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+

|  1 | SIMPLE      | t1    | range | PRIMARY,idx_id    | idx_id    | 4      | NULL |    2 | Using where |

+----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+

1 row in set (0.02 sec)

(10).index

该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。

(11). ALL

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/55222151011ee80eed7c19244d86116e.html