当MySQL使用全表扫描来解析查询时,EXPLAIN的输出在type列中显示ALL。
这种情况通常发生在以下情况下:
该表非常小,因此执行全表扫描比查找关键字更快。这对于少于10行且行长较短的表来说很常见。
对于索引列,ON或WHERE子句中没有可用的限制。
您正在将索引列与常数值进行比较,MySQL(根据索引树)计算出,这些常数值覆盖了表的很大一部分,并且全表扫描会更快。参见“WHERE子句优化”。
【MySQL精通之路】SQL优化(1)-查询优化(1)-WHERE子句-CSDN博客
您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL假设使用KEY可能需要许多KEY查找,并且全表扫描会更快。
对于小型表,表扫描通常是合适的,并且对性能的影响可以忽略不计。对于大型表,请尝试以下技术,以避免优化器错误地选择全表扫描:
使用ANALYZE TABLE tbl_name更新扫描表的KEY分布。参见“分析表语句”。
对扫描的表使用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告诉优化器key扫描不会超过1000个。
请参阅“服务器系统变量”。