MySQL查询优化之避免全表扫描

原文地址:https://dev.mysql.com/doc/refman/5.7/en/table-scan-avoidance.html

译文:

8.2.1.20 避免全表扫描

当MySQL使用全表扫描来解析查询时,EXPLAIN的输出结果中将在type列显示ALL。这种情况通常发生在下列情况下:

    1)表非常小,执行表扫描比查找键要快。对于少于10行且行长度较短的表来说,这很常见;

    2)ON或WHERE子句中没有可用于索引列的限制;

    3)将索引列与常量值进行比较,MySQL已经计算出(基于索引树)常量覆盖了表的很大一部分,表扫描会更快。可以参考Section 8.2.1.1, “WHERE Clause Optimization”

    4)通过另一列使用低基数(许多行匹配键值)的键。在本例中,MySQL假设通过使用键,它可能会执行许多键查找,而表扫描会更快。

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

    1)使用ANALYZE TABLE tbl_name更新扫描表的键分布,具体参考Section 13.7.2.1, “ANALYZE TABLE Syntax”

    2)对扫描表使用FORCE INDEX告诉MySQL,与使用给定的索引相比,表扫描非常昂贵;

SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
  WHERE t1.col_name=t2.col_name;

    可以参考Section 8.9.4, “Index Hints”.

    3)使用--max-seeks-for-key=1000选项启动mysqld,或者使用SET max_seeks_for_key=1000来告诉优化器没有导致超过1000个键查找的键扫描。具体可参考Section 5.1.7, “Server System Variables”

PS:由于水平有限,译文中难免会存在谬误,欢迎批评指正。

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/85677466
今日推荐