4、使用explain查詢,查看索引使用情況(這里還可以進行多次其他sql語句的查詢,查看索引利用情況)
從上面可以看到key_len使用的長度為38(字節),那么總的索引長度是多少呢?
下面繼續對表的創建進行查看,查看各個字段的大小
其中:
latin1 = 1 byte = 1 character
uft8 = 3 byte = 1 character
gbk = 2 byte = 1 character
從上面這些可以計算索引的長度:
10*3(varchar 10)+3(標記變長)+1(標記可為null)+其他(不清楚)
組合索引的長度10*3+11已經大於38,所以推論只用到了組合索引的一部分。
5、下面是對explain其他的參數進行說明:
table:
這是表的名字。
type:
連接操作的類型。下面是MySQL文檔關於ref連接類型的說明:
“對於每一種與另一個表中記錄的組合,mysql將從當前的表讀取所有帶有匹配索引值的記錄。如果連接操作只使用鍵的最左前綴,或者如果鍵不是UNIQUE或PRIMARY KEY類型(換句話說,如果連接操作不能根據鍵值選擇出唯一行),則MySQL使用ref連接類型。如果連接操作所用的鍵只匹配少量的記錄,則ref是一種好的連接類型。”
在本例中,由於索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型。
如果EXPLAIN顯示連接類型是“ALL”,而且你並不想從表里面選擇出大多數記錄,那么MySQL的操作效率將非常低,因為它要掃描整個表。你可以加入更多的索引來解決這個問題。預知更多信息,請參見MySQL的手冊說明。
本例子中是rang,下面是對type值的解釋
這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALL
Type:告訴我們對表所使用的訪問方式,主要包含如下集中類型;
◇ all:全表掃描
◇ const:讀常量,且最多只會有一條記錄匹配,由於是常量,所以實際上只需要讀一次;
◇ eq_ref:最多只會有一條匹配結果,一般是通過主鍵或者唯一鍵索引來訪問;
◇ fulltext:
◇ index:全索引掃描;
◇ index_merge:查詢中同時使用兩個(或更多)索引,然后對索引結果進行merge 之后再讀
取表數據;
◇ index_subquery:子查詢中的返回結果字段組合是一個索引(或索引組合),但不是一個
主鍵或者唯一索引;
◇ rang:索引范圍掃描;
◇ ref:Join 語句中被驅動表索引引用查詢;
◇ ref_or_null:與ref 的唯一區別就是在使用索引引用查詢之外再增加一個空值的查詢;
◇ system:系統表,表中只有一行數據;
◇ unique_subquery:子查詢中的返回結果字段組合是主鍵或者唯一約束;
possible_keys:
可能可以利用的索引的名字。這里的索引名字是創建索引時指定的索引昵稱;如果索引沒有昵稱,則默認顯示的是索引中第一個列的名字(在本例中,它是“firstname”)。默認索引名字的含義往往不是很明顯。
key:
它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。
key_len:
索引中被使用部分的長度,以字節計
ref:
列出是通過常量(const),還是某個表的某個字段(如果是join)來過濾(通過key)
的;
rows:
MySQL所認為的它在找到正確的結果之前必須掃描的記錄數。顯然,這里最理想的數字就是1。