MySQL 8.4 Release Notes
10.2.1.23 避免全表扫描
EXPLAIN 语句的输出显示EXPLAIN
中的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;
-
启动mysqld 使用
--max-seeks-for-key=1000
选项或使用SET max_seeks_for_key=1000
告诉优化器假设无键扫描不会导致超过 1,000 个键查找。见第7.1.8节,“服务器系统变量”。