当 MySQL 使用
全表扫描来解析查询时
,输出EXPLAIN
显示
ALL
在
列中。这通常发生在以下条件下:
type
该表非常小,执行表扫描比费心查找键要快。这对于行数少于 10 且行长度较短的表很常见。
索引列 的
ON
or子句 中没有可用的限制 。WHERE
您正在将索引列与常量值进行比较,并且 MySQL 已经计算出(基于索引树)常量覆盖表的太大部分并且表扫描会更快。请参阅 第 8.2.1.1 节,“WHERE 子句优化”。
您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL 假设通过使用键,它可能会执行许多键查找,并且表扫描会更快。
对于小表,表扫描通常是合适的,性能影响可以忽略不计。对于大型表,请尝试以下技术以避免优化器错误地选择表扫描:
用于更新扫描表的键分布。请参阅 第 13.7.2.1 节,“ANALYZE TABLE 语句”。
ANALYZE TABLE
tbl_name
用于
FORCE INDEX
扫描表告诉 MySQL 与使用给定索引相比,表扫描非常昂贵:SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
请参阅第 8.9.4 节,“索引提示”。
使用 option 或 use 启动mysqld以告诉优化器假定没有键扫描会导致超过 1,000 次键查找。请参阅第 5.1.7 节,“服务器系统变量”。
--max-seeks-for-key=1000
SET max_seeks_for_key=1000