MySQL 8.4 发行说明
来自 EXPLAIN
的输出显示 ALL
在 type
列中,当 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;
启动 mysqld 使用
--max-seeks-for-key=1000
选项或使用SET max_seeks_for_key=1000
告诉优化器假设没有键扫描会导致超过 1,000 个键查找。参见 第 7.1.8 节,“服务器系统变量”。