MySQL 8.4 發行說明
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 節「伺服器系統變數」。