• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 避免全表扫描

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

    • 该表是如此之小,以至于执行表扫描要比打扰键查找要快得多。对于少于10行且行长较短的表,这是很常见的。
    • 索引列的ONor WHERE子句中没有可用的限制。
    • 您正在将索引列与常量值进行比较,并且MySQL已计算(基于索引树)(常量覆盖了表的很大一部分)并且表扫描会更快。请参见“ WHERE子句优化”。
    • 您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL假定通过使用键,它可能会执行许多键查找,并且表扫描会更快。

    对于小型表,表扫描通常是合适的,并且对性能的影响可以忽略不计。对于大型表,请尝试以下技术,以避免优化器错误地选择表扫描:

    • 使用更新的扫描表的键分布。请参见“ 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;
      

      请参见“索引提示”。

    • 使用该选项启动mysqld--max-seeks-for-key=1000或使用SET max_seeks_for_key=1000告诉优化器假定没有键扫描导致超过1000个键查找。请参见“服务器系统变量”。