MySQL - Explain ,索引最佳化

摘要:MySQL - Explain ,索引最佳化

參考文章

http://article.denniswave.com/6337

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

 

截取重點資訊如下,對於index有些瞭解,要進一步知道,如何下索引,或如何分析索引效率,可以快速知道重點部分。

最左前綴

多列索引還有另外一個優點,它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。繼續考慮前面的例子,現在我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜索條件是以下各種列的組合時,MySQL將使用fname_lname_age索引:

firstname,lastname,age
firstname,lastname
firstname

 

我自己瞭解的狀況如下:

根據 leftmost prefixes 的狀況,

如果我的索引是colA,colB,colC

則(colA)或(colA,colB)或(colA,colB,colC)的狀況下,將會使用索引

若使用 colA 及colD查詢時,則會先查colA,減少需要查詢的row,再使用中結果集再繼續比對colD

 

分析索引效率

現在我們已經知道了一些如何選擇索引列的知識,但還無法判斷哪一個最有效。MySQL提供了一個內建的SQL命令幫助我們完成這個任務,這就是EXPLAIN命令。EXPLAIN命令的一般語法是:EXPLAIN <SQL命令>。你可以在MySQL文檔找到有關該命令的更多說明。下面是一個例子:

EXPLAIN SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17';

這個命令將返回下面這種分析結果:

table type possible_keys key key_len ref rows Extra
people ref fname_lname_age fname_lname_age 102 const,const,const 1 Where used

 

我實際使用狀況

我有一個SQL語句會是如下

select count(*) , colC from table where colA = 1 and colB = 0 group by colC

如果我下索引只有colA and colB  ,命名為  index_nameA

則他的

type =ALL ,

key = NULL ,

possible_keys=index_nameA

Extra = Using where ;Using temporary;Using filesort

結果,40萬筆的資料,需查5秒鐘的時間。如果不下index,則需要13秒的時間

修改index_nameA 為 (colA,colB,colC) 則得到3秒以內的查詢時間。分析結果會變如下

type =index, 

key = index_nameA, 

possible_keys=index_nameA

Extra = Using where ,Using index; Using temporary;Using filesort

 

當我有兩個index

一個 UNIQUE 及 一個 index_nameA

則 當查詢條件中有UNIQUE時,如colD 

select count(*) , colC from table where colA = 1 and colB = 0 and colD group by colC

他將以colD為優先

 

type 的值,可能有system,,const,eq_ref,ref , ref_or_null,unique_subquery,index_subquery,range,index,ALL

ref的值,可能有ref,null,const

參考

http://dev.mysql.com/doc/refman/4.1/en/explain-output.html