SELECT * FROM ref_table
WHERE key_column=expr OR key_column IS NULL;
index_merge
這種連接類型意味著使用了 Index Merge 優化方法。這種情況下,key字段包括了所有使用的索引,key_len 包括了使用的鍵的最長部分。詳情請看"7.2.5 How MySQL Optimizes OR Clauses"。
unique_subquery
這種類型用例如一下形式的 IN 子查詢來替換 ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery 只是用來完全替換子查詢的索引查找函數效率更高了。
index_subquery
這種連接類型類似 unique_subquery。它用子查詢來代替 IN,不過它用于在子查詢中沒有唯一索引的情況下,例如以下形式:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range
只有在給定范圍的記錄才會被取出來,利用索引來取得一條記錄。key 字段表示使用了哪個索引。key_len 字段包括了使用的鍵的最長部分。這種類型時 ref 字段值是 NULL。range 用于將某個字段和一個定植用以下任何操作符比較時 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, 或 IN
SELECT * FROM tbl_name
WHERE key_column = 10;
SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name
WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name
WHERE key_part1= 10 AND key_part2 IN (10,20,30);
index
連接類型跟 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 子句,它以不同的方式列出了各個字段
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com