mysql typeindex_explain mysql的type字段,索引的类型
4.type
這列很重要,顯示了連接使用了哪種類別,有無使用索引.
從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALL
(1).system
這是const聯(lián)接類型的一個特例。表僅有一行滿足條件.如下(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?????|??|?system?|?NULL??????????????|?NULL????|?NULL????|?NULL?|????1?|???????|
|??2?|?DERIVED?????|?t3?????????|?const??|?PRIMARY,idx_t3_id?|?PRIMARY?|?4???????|??????|????1?|???????|
+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
(2).const
表最多有一個匹配行,它將在查詢開始時被讀取。因為僅有一行,在這行的列值可被優(yōu)化器剩余部分認為是常數(shù)。const表很快,因為它們只讀取一次!
const用于用常數(shù)值比較PRIMARY?KEY或UNIQUE索引的所有部分時。在下面的查詢中,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?|???????|
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
注:常量表的定義如下:
1)??一個表只有0行或者1行數(shù)據(jù)。
2)??在WHERE子句中包含條件column = constant,并且這些列是primary key,或者這些列是UNIQUE(假設該UNIQUE同時被定義為NOT NULL)。這樣生成的查詢結(jié)果也可以成為常量表。
(3).?eq_ref
對于每個來自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯(lián)接類型,除了const類型。它用在一個索引的所有部分被聯(lián)接使用并且索引是UNIQUE或PRIMARY?KEY。
eq_ref可以用于使用=?操作符比較的帶索引的列。比較值可以為常量或一個使用在該表前面所讀取的表的列的表達式。
在下面的例子中,MySQL可以使用eq_ref聯(lián)接來處理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
對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果聯(lián)接只使用鍵的最左邊的前綴,或如果鍵不是UNIQUE或PRIMARY?KEY(換句話說,如果聯(lián)接不能基于關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯(lián)接類型是不錯的。
ref可以用于使用=或<=>操作符的帶索引的列。
在下面的例子中,MySQL可以使用ref聯(lián)接來處理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
該聯(lián)接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。在解決子查詢中經(jīng)常使用該聯(lián)接類型的優(yōu)化。
在下面的例子中,MySQL可以使用ref_or_null聯(lián)接來處理ref_tables:
SELECT?*?FROM?ref_table
WHERE?key_column=expr?OR?key_column?IS?NULL;
(6).?index_merge
該聯(lián)接類型表示使用了索引合并優(yōu)化方法。在這種情況下,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
子查詢使用了unique或者primary key
該類型替換了下面形式的IN子查詢的ref:
value?IN?(SELECT?primary_key?FROM?single_table?WHERE?some_expr)
unique_subquery是一個索引查找函數(shù),可以完全替換子查詢,效率更高。
(8).index_subquery
子查詢使用了普通索引
該聯(lián)接類型類似于unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引:
value?IN?(SELECT?key_column?FROM?single_table?WHERE?some_expr)
(9).range
只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。key_len包含所使用索引的最長關鍵元素。在該類型中ref列為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
該聯(lián)接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數(shù)據(jù)文件小。
當查詢只使用作為單索引一部分的列時,MySQL可以使用該聯(lián)接類型。
(11).?ALL
對于每個來自于先前的表的行組合,進行完整的表掃描。如果表是第一個沒標記const的表,這通常不好,并且通常在它情況下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常數(shù)值或列值被檢索出。
總結(jié)
以上是生活随笔為你收集整理的mysql typeindex_explain mysql的type字段,索引的类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone13配置怎么样有什么重磅新功
- 下一篇: win mysql 2003错误_win