介绍
当使用全表扫描时EXPLAIN 的type字段输出ALL。通常以下情况可能趋向于全表扫描:
- 表很小,全表扫秒比使用索引扫描更快,这对于行少于10行且行长度较短的表来说很常见。
- 当ON或者WHERE条件中没有索引可以使用的条件时。
- 将索引与常量值进行了比较,并且索引通过计算发现,这个常量值覆盖了整个表的大部分,通过全表扫描比索引扫描更快。
- 使用的列的区分度较低(很多行匹配了键值),然后查询索引的下一列,在这种情况下,可能需要对索引,这种情况下MYSQL可能通过关键字扫描需要扫描很多杆件自,所以表扫描更快。
对于小型表,表扫描通常是合适的,性能影响可以忽略不计。对于大型表,请尝试以下技术以避免优化程序错误地选择表扫描:
-
使用更新的扫描表的键分布, ANALYZE TABLE tbl_name。
-
使用FORCE INDEX强制使用索引,告诉优化器使用表扫描比指定的索引扫描代价高很多。
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次的索引搜索。