MySQL 9.0 版本說明
EXPLAIN
的輸出在 MySQL 使用全表掃描來解析查詢時,會在 type
欄位中顯示 ALL
。這通常在以下情況下發生:
表格太小,執行全表掃描比費力進行索引查閱更快。這在少於 10 列且列長度較短的表格中很常見。
在索引欄位的
ON
或WHERE
子句中沒有可用的限制。您正在比較索引欄位和常數值,而且 MySQL 已計算出 (基於索引樹) 這些常數涵蓋了表格的太大部分,因此全表掃描會更快。請參閱 章節 10.2.1.1,「WHERE 子句最佳化」。
您正在透過另一個欄位使用基數較低的索引 (許多列符合索引值)。在這種情況下,MySQL 會假設使用索引可能需要多次索引查閱,因此全表掃描會更快。
對於小型表格,全表掃描通常是適當的,且效能影響微不足道。對於大型表格,請嘗試下列技術,以避免最佳化工具錯誤地選擇全表掃描:
使用
ANALYZE TABLE
來更新掃描表格的索引分佈。請參閱 章節 15.7.3.1,「ANALYZE TABLE 陳述式」。tbl_name
針對掃描的表格使用
FORCE INDEX
來告知 MySQL,相較於使用指定的索引,全表掃描的成本非常高。SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
請參閱 章節 10.9.4,「索引提示」。
使用
--max-seeks-for-key=1000
選項啟動 mysqld 或使用SET max_seeks_for_key=1000
來告知最佳化工具,假設沒有索引掃描會導致超過 1,000 次索引搜尋。請參閱 章節 7.1.8,「伺服器系統變數」。