mysql聯合索引的作用域

2021-06-26 21:01:49 字數 2479 閱讀 1485

explain  解釋: explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇使用更優的索引以及優化查詢語句。

使用方法:在select語句前面加上 explain   命令即可。如下:

explain   select * from `t_test` where status='0';

以下用幾個例項說明explain對索引的解析。

例項1):

索引表 

ps:由上圖可知,此例中當存在兩個索引, qid和qid,status時,優先使用qid單獨索引。

例項2):

ps:由上圖可知,此時使用了聯合索引。

例項3):

ps:有圖可知,此時使用不到索引。 即:若聯合索引最左的字段為範圍查詢,使用不上索引。

附: explain列的詳細說明如下:

table:顯示這一行的資料是關於哪張表的

type:這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const、eq_reg、ref、range、indexhe和all

possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從where語句中選擇乙個合適的語句

key: 實際使用的索引。如果為null,則沒有使用索引。很少的情況下,mysql會選擇優化不足的索引。這種情況下,可以在select語句中使用use

index(indexname)來強制使用乙個索引或者用ignore index(indexname)來強制mysql忽略索引

key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好

ref:顯示索引的哪一列被使用了,如果可能的話,是乙個常數

rows:mysql認為必須檢查的用來返回請求資料的行數

extra:關於mysql如何解析查詢的額外資訊。將在下文詳細說明,但這裡可以看到的壞的例子是using temporary和using filesort,意思mysql根本不能使用索引,結果是檢索會很慢

extra列返回的描述的意義:

distinct:一旦mysql找到了與行相聯合匹配的行,就不再搜尋了

not exists: mysql優化了left join,一旦它找到了匹配left join標準的行,就不再搜尋了

range checked for each record(index map:#):沒有找到理想的索引,因此對於從前面表中來的每乙個行組合,mysql檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一

using filesort: 看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行

using index: 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同乙個索引的部分的時候

using temporary 看到這個的時候,查詢需要優化了。這裡,mysql需要建立乙個臨時表來儲存結果,這通常發生在對不同的列集進行order by上,而不是group by上

where used 使用了where從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,並且連線型別all或index,這就會發生,或者是查詢有問題不同連線型別的解釋(按照效率高低的順序排序)

system 表只有一行:system表。這是const連線型別的特殊情況

const:表中的乙個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為mysql先讀這個值然後把它當做常數來對待

eq_ref:在連線中,mysql在查詢時,從前面的表中,對每乙個記錄的聯合都從表中讀取乙個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用

ref:這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每乙個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於根據索引匹配的記錄多少—越少越好

range:這個連線型別使用索引返回乙個範圍中的行,比如使用》或《查詢東西時發生的情況

index: 這個連線型別對前面的表中的每乙個記錄聯合進行完全掃瞄(比all更好,因為索引一般小於表資料)

all:這個連線型別對於前面的每乙個記錄聯合進行完全掃瞄,這一般比較糟糕,應該盡量避免

mysql 聯合主鍵的作用 索引的作用

聯合主鍵就是用2個或2個以上的字段組成主鍵。用這個主鍵包含的字段作為主鍵,這個組合在資料表中是唯一,且加了主鍵索引。可以這麼理解,比如,你的訂單表裡有很多字段,一般情況只要有個訂單號bill no做主鍵就可以了,但是,現在要求可能會有補 充訂單,使用相同的訂單號,那麼這時單獨使用訂單號就不可以了,因...

mysql的聯合索引 mysql聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...

mysql聯合索引詳解 mysql 聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...