避免全表扫描
跳到导航
跳到搜索
当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个键查找。