MySQL手冊版本 5.0.20-MySQL最佳化

來源:互聯網
上載者:User

http://tech.ccidnet.com/art/321/20060817/832025_3.html

 

 

連線類型跟 ALL 一樣,不同的是它只掃描索引樹。它通常會比 ALL 快點,因為索引檔案通常比資料檔案小。MySQL在查詢的欄位知識單獨的索引的一部分的情況下使用這種連線類型。

 

ALL

 

將對該表做全部掃描以和從前一個表中取得的記錄作聯合。這時候如果第一個表沒有被標識為 const 的話就不大好了,在其他情況下通常是非常糟糕的。正常地,可以通過增加索引使得能從表中更快的取得記錄以避免 ALL。

 

possible_keys

 

possible_keys 欄位是指MySQL在搜尋表記錄時可能使用哪個索引。注意,這個欄位完全獨立於 EXPLAIN 顯示的表順序。這就意味著 possible_keys 裡面所包含的索引可能在實際的使用中沒用到。如果這個欄位的值是 NULL,就表示沒有索引被用到。這種情況下,就可以檢查 WHERE 子句中哪些欄位那些欄位適合增加索引以提高查詢的效能。就這樣,建立一下索引,然後再用 EXPLAIN 檢查一下。詳細的查看章節"14.2.2 ALTER TABLE Syntax"。想看錶都有什麼索引,可以通過 SHOW INDEX FROM tbl_name 來看。

 

key

 

key 欄位顯示了MySQL實際上要用的索引。當沒有任何索引被用到的時候,這個欄位的值就是 NULL。想要讓MySQL強行使用或者忽略在 possible_keys 欄位中的索引列表,可以在查詢語句中使用關鍵字FORCE INDEX, USE INDEX, 或 IGNORE INDEX。如果是 MyISAM 和 BDB 類型表,可以使用 ANALYZE TABLE 來協助分析使用使用哪個索引更好。如果是 MyISAM 類型表,運行命令 myisamchk --analyze 也是一樣的效果。詳細的可以查看章節"14.5.2.1 ANALYZE TABLE Syntax"和"5.7.2 Table Maintenance and Crash Recovery"。

 

key_len

 

key_len 欄位顯示了MySQL使用索引的長度。當 key 欄位的值為 NULL 時,索引的長度就是 NULL。注意,key_len 的值可以告訴你在聯合索引中MySQL會真正使用了哪些索引。

 

ref

 

ref 欄位顯示了哪些欄位或者常量被用來和 key 配合從表中查詢記錄出來。

 

rows

 

rows 欄位顯示了MySQL認為在查詢中應該檢索的記錄數。

 

Extra

 

本欄位顯示了查詢中MySQL的附加資訊。以下是這個欄位的幾個不同值的解釋:

 

Distinct

 

MySQL當找到目前記錄的匹配聯合結果的第一條記錄之後,就不再搜尋其他記錄了。

 

Not exists

 

MySQL在查詢時做一個 LEFT JOIN 最佳化時,當它在當前表中找到了和前一條記錄符合 LEFT JOIN 條件後,就不再搜尋更多的記錄了。下面是一個這種類型的查詢例子:

 

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id

WHERE t2.id IS NULL;

假使 t2.id 定義為 NOT NULL。這種情況下,MySQL將會掃描表 t1 並且用 t1.id 的值在 t2 中尋找記錄。當在 t2 中找到一條匹配的記錄時,這就意味著 t2.id 肯定不會都是 NULL,就不會再在 t2 中尋找相同 id 值的其他記錄了。也可以這麼說,對於 t1 中的每個記錄,MySQL只需要在 t2 中做一次尋找,而不管在 t2 中實際有多少匹配的記錄。

 

range checked for each record (index map: #)

 

MySQL沒找到合適的可用的索引。取代的辦法是,對於前一個表的每一個行串連,它會做一個檢驗以決定該使用哪個索引(如果有的話),並且使用這個索引來從表裡取得記錄。這個過程不會很快,但總比沒有任何索引時做表串連來得快。

 

Using filesort

 

MySQL需要額外的做一遍從而以排好的順序取得記錄。排序程式根據串連的類型遍曆所有的記錄,並且將所有符合 WHERE 條件的記錄的要排序的鍵和指向記錄的指標儲存起來。這些鍵已經排完序了,對應的記錄也會按照排好的順序取出來。詳情請看"7.2.9 How MySQL Optimizes ORDER BY"。

 

Using index

 

欄位的資訊直接從索引樹中的資訊取得,而不再去掃描實際的記錄。這種策略用於查詢時的欄位是一個獨立索引的一部分。

 

Using temporary

 

MySQL需要建立暫存資料表儲存結果以完成查詢。這種情況通常發生在查詢時包含了GROUP BY 和 ORDER BY 子句,它以不同的方式列出了各個欄位。

 

Using where

 

WHERE 子句將用來限制哪些記錄匹配了下一個表或者發送給用戶端。除非你特別地想要取得或者檢查表種的所有記錄,否則的話當查詢的 Extra 欄位值不是 Using where 並且表連線類型是 ALL 或 index 時可能表示有問題。

 

如果你想要讓查詢儘可能的快,那麼就應該注意 Extra 欄位的值為Using filesort 和 Using temporary 的情況。

 

你可以通過 EXPLAIN 的結果中 rows 欄位的值的乘積大概地知道本次串連表現如何。它可以粗略地告訴我們MySQL在查詢過程中會查詢多少條記錄。如果是使用系統變數 max_join_size 來取得查詢結果,這個乘積還可以用來確定會執行哪些多表 SELECT 語句。詳情請看"7.5.2 Tuning Server Parameters"。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.