當MySQL使用全表掃描來解析查詢時,EXPLAIN的輸出在type列中顯示ALL。
這種情況通常發生在以下情況下:
該表非常小,因此執行全表掃描比查找關鍵字更快。這對于少于10行且行長較短的表來說很常見。
對于索引列,ON或WHERE子句中沒有可用的限制。
您正在將索引列與常數值進行比較,MySQL(根據索引樹)計算出,這些常數值覆蓋了表的很大一部分,并且全表掃描會更快。參見“WHERE子句優化”。
【MySQL精通之路】SQL優化(1)-查詢優化(1)-WHERE子句-CSDN博客
您正在通過另一列使用基數較低的鍵(許多行與鍵值匹配)。在這種情況下,MySQL假設使用KEY可能需要許多KEY查找,并且全表掃描會更快。
對于小型表,表掃描通常是合適的,并且對性能的影響可以忽略不計。對于大型表,請嘗試以下技術,以避免優化器錯誤地選擇全表掃描:
使用ANALYZE TABLE tbl_name更新掃描表的KEY分布。參見“分析表語句”。
對掃描的表使用FORCE INDEX來告訴MySQL,與使用給定索引相比,全表掃描非常昂貴:
SELECT * FROM t1, t2 FORCE INDEX (index_for_column)WHERE t1.col_name=t2.col_name;
參見“索引提示”。
使用--max seeks for key=1000選項啟動mysqld,或者使用SET max_seeks_for_key=1000告訴優化器key掃描不會超過1000個。
請參閱“服務器系統變量”。