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已經計算出(基於索引樹)常量覆蓋了表的很大一部分,表掃描會更快。可以參考
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:由於水平有限,譯文中難免會存在謬誤,歡迎批評指正。