1. 程式人生 > >MySQL查詢優化之避免全表掃描

MySQL查詢優化之避免全表掃描

原文地址:https://dev.mysql.com/doc/refman/5.7/en/table-scan-avoidance.html

譯文:

8.2.1.20 避免全表掃描

當MySQL使用全表掃描來解析查詢時,EXPLAIN的輸出結果中將在type列顯示ALL。這種情況通常發生在下列情況下:

    1)表非常小,執行表掃描比查詢鍵要快。對於少於10行且行長度較短的表來說,這很常見;

    2)ON或WHERE子句中沒有可用於索引列的限制;

    3)將索引列與常量值進行比較,MySQL已經計算出(基於索引樹)常量覆蓋了表的很大一部分,表掃描會更快。可以參考

Section 8.2.1.1, “WHERE Clause Optimization”

    4)通過另一列使用低基數(許多行匹配鍵值)的鍵。在本例中,MySQL假設通過使用鍵,它可能會執行許多鍵查詢,而表掃描會更快。

對於小型表,表掃描通常是合適的,其效能影響可以忽略不計。對於大型表,可以嘗試以下技術,以避免優化器錯誤地選擇表掃描:

    1)使用ANALYZE TABLE tbl_name更新掃描表的鍵分佈,具體參考Section 13.7.2.1, “ANALYZE TABLE Syntax”

    2)對掃描表使用FORCE INDEX告訴MySQL,與使用給定的索引相比,表掃描非常昂貴;

SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
  WHERE t1.col_name=t2.col_name;

    可以參考Section 8.9.4, “Index Hints”.

    3)使用--max-seeks-for-key=1000選項啟動mysqld,或者使用SET max_seeks_for_key=1000來告訴優化器沒有導致超過1000個鍵查詢的鍵掃描。具體可參考Section 5.1.7, “Server System Variables”

PS:由於水平有限,譯文中難免會存在謬誤,歡迎批評指正。