避免全表扫描

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年8月31日 (四) 09:02的版本 (创建页面,内容为“ 当MySQL使用全表扫描来解析查询时,EXPLAIN的输出在类型列中显示为ALL。这通常发生在以下情况下: * 表的大小很小,执行全表扫描比使用索引查找更快。这在行数少于10行且行长度较短的表中很常见。 * ON或WHERE子句中没有可用于索引列的限制条件。 * 您正在将索引列与常量值进行比较,而MySQL已根据索引树计算出常量覆盖表的太大部分,使用表扫描…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

当MySQL使用全表扫描来解析查询时,EXPLAIN的输出在类型列中显示为ALL。这通常发生在以下情况下:

  • 表的大小很小,执行全表扫描比使用索引查找更快。这在行数少于10行且行长度较短的表中很常见。
  • ON或WHERE子句中没有可用于索引列的限制条件。
  • 您正在将索引列与常量值进行比较,而MySQL已根据索引树计算出常量覆盖表的太大部分,使用表扫描会更快。
  • 您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL假设使用键可能需要许多键查找,并且使用表扫描会更快。


对于小表,表扫描通常是适当的,性能影响很小。对于大表,请尝试以下技术以避免优化器错误地选择表扫描:

  • 使用ANALYZE TABLE tbl_name命令更新扫描表的键分布。

  • 对于扫描的表,使用FORCE INDEX命令告诉MySQL表扫描与使用给定索引相比非常昂贵:

      SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
      WHERE t1.col_name=t2.col_name;
  • 使用–max-seeks-for-key=1000选项启动mysqld,或者使用SET max_seeks_for_key=1000命令告诉优化器假设没有键扫描导致超过1000个键查找。