Friday, March 1, 2013

[好文][MYSQL] MySQL索引分析和優化 (index) (EXPLAIN)

MySQL索引分析和優化

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

tabletypepossible_keyskeykey_lenrefrowsExtra
peoplereffname_lname_agefname_lname_age102const,const,const1Where used

    1. table
    2. 這是表的名字。

    3. type
    4. 連接操作的類型。下面是MySQL文檔關於ref連接類型的說明:
      「對 於每一種與另一個表中記錄的組合,MySQL將從當前的表讀取所有帶有匹配索引值的記錄。如果連接操作只使用鍵的最左前綴,或者如果鍵不是UNIQUE或 PRIMARY KEY類型(換句話說,如果連接操作不能根據鍵值選擇出唯一行),則MySQL使用ref連接類型。如果連接操作所用的鍵只匹配少量的記錄,則ref是一 種好的連接類型。」
      在本例中,由於索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型。
      如果EXPLAIN顯示連接類型是「ALL」,而且你並不想從表裡面選擇出大多數記錄,那麼MySQL的操作效率將非常低,因為它要掃瞄整個表。你可以加入更多的索引來解決這個問題。預知更多信息,請參見MySQL的手冊說明。

    5. possible_keys
    6. 可能可以利用的索引的名字。這裡的索引名字是創建索引時指定的索引暱稱;如果索引沒有暱稱,則默認顯示的是索引中第一個列的名字(在本例中,它是「firstname」)。默認索引名字的含義往往不是很明顯。

    7. Key
    8. 它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。

    9. key_len
    10. 索引中被使用部分的長度,以字節計。在本例中,key_len是102,其中firstname佔50字節,lastname佔50字節,age佔2字節。如果MySQL只使用索引中的firstname部分,則key_len將是50。

    11. ref
    12. 它顯示的是列的名字(或單詞「const」),MySQL將根據這些列來選擇行。在本例中,MySQL根據三個常量選擇行。

    13. rows
    14. MySQL所認為的它在找到正確的結果之前必須掃瞄的記錄數。顯然,這裡最理想的數字就是1。

    15. Extra
    16. 這裡可能出現許多不同的選項,其中大多數將對查詢產生負面影響。在本例中,MySQL只是提醒我們它將用WHERE子句限制搜索結果集。

    No comments:

    Post a Comment