MySQL 9.0 发行说明
来自 EXPLAIN
的输出在 type
列中显示 ALL
,当 MySQL 使用 全表扫描 来解析查询时。这通常发生在以下情况
表很小,以至于执行表扫描比使用键查找更快。这在具有少于 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 节,“服务器系统变量”.