日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql typeindex_explain mysql的type字段,索引的类型

發(fā)布時間:2023/12/2 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql typeindex_explain mysql的type字段,索引的类型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。