mysql explain输出中type的取值说明
2016-05-26 11:25 abce 阅读(303) 评论(0) 编辑 收藏 举报1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | 原文: http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html 这列很重要,显示了连接使用了哪种连接类别,有无使用索引. 从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和 ALL (1).system 这是const联接类型的一个特例。表仅有一行满足条件.如下(t3表上的id是 primary key ) mysql> explain select * from ( select * from t3 where id=3952602) a ; + ----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+ | 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | | | 2 | DERIVED | t3 | const | PRIMARY ,idx_t3_id | PRIMARY | 4 | | 1 | | + ----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+ (2).const 表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次! const用于通过主键、唯一性键查询时。在下面的查询中,tbl_name可以用于const表: SELECT * from tbl_name WHERE primary_key=1; SELECT * from tbl_name WHERE primary_key_part1=1和 primary_key_part2=2; 例如: mysql> explain select * from t3 where id=3952602; + ----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | t3 | const | PRIMARY ,idx_t3_id | PRIMARY | 4 | const | 1 | | + ----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ (3). eq_ref 对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。 它用在一个索引的所有部分被联接使用并且索引是 UNIQUE 或 PRIMARY KEY 。 eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。 在下面的例子中,MySQL可以使用eq_ref联接来处理ref_tables: SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table. column ; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table. column AND ref_table.key_column_part2=1; 例如 mysql> create unique index idx_t3_id on t3(id) ; Query OK, 1000 rows affected (0.03 sec) Records: 1000 Duplicates: 0 Warnings: 0 mysql> explain select * from t3,t4 where t3.id=t4.accountid; + ----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+ | 1 | SIMPLE | t4 | ALL | NULL | NULL | NULL | NULL | 1000 | | | 1 | SIMPLE | t3 | eq_ref | PRIMARY ,idx_t3_id | idx_t3_id | 4 | dbatest.t4.accountid | 1 | | + ----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+ (4).ref 对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是 UNIQUE 或 PRIMARY KEY (换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。 ref可以用于使用=或<=>操作符的带索引的列。 在下面的例子中,MySQL可以使用ref联接来处理ref_tables: SELECT * FROM ref_table WHERE key_column=expr; SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table. column ; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table. column AND ref_table.key_column_part2=1; 例如: mysql> drop index idx_t3_id on t3; Query OK, 1000 rows affected (0.03 sec) Records: 1000 Duplicates: 0 Warnings: 0 mysql> create index idx_t3_id on t3(id) ; Query OK, 1000 rows affected (0.04 sec) Records: 1000 Duplicates: 0 Warnings: 0 mysql> explain select * from t3,t4 where t3.id=t4.accountid; + ----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+ | 1 | SIMPLE | t4 | ALL | NULL | NULL | NULL | NULL | 1000 | | | 1 | SIMPLE | t3 | ref | PRIMARY ,idx_t3_id | idx_t3_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=3952602 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 t3 where id=3952602 or id=3952603 ; + ----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + ----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+ | 1 | SIMPLE | t3 | range | PRIMARY ,idx_t3_id | idx_t3_id | 4 | NULL | 2 | Using where | + ----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+ 1 row in set (0.02 sec) (10). index 该联接类型与 ALL 相同,除了只有索引树被扫描。这通常比 ALL 快,因为索引文件通常比数据文件小。 当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。 (11). ALL 对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用 ALL ,使得行能基于前面的表中的常数值或列值被检索出。 (12).fulltext 使用了全文索引 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)