我有一个带有int列索引的表。
Create table sample(
col1 varchar,
col2 int)
Create index idx1 on sample(col2);
当我解释以下查询时
Select * from sample where col2>2;
进行全表扫描。
为什么索引在这里不起作用?
当表有大约2000万条记录时,如何优化此类查询?
答案 0 :(得分:4)
仅仅因为您创建了索引,并不意味着MySQL会一直使用它。根据{{3}},以下是它可能选择对索引使用全表扫描的几个原因:
表是如此之小,以至于执行表扫描要比打扰键查找要快得多。对于少于10行且行长较短的表,这很常见。
在ON或WHERE子句中,对于索引列没有可用的限制。
您正在将索引列与常量值进行比较,MySQL计算得出(基于索引树),常量覆盖了表的很大部分,并且表扫描会更快。请参见第8.2.1.1节“ WHERE子句优化”。
您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL假定通过使用键,它可能会执行许多键查找,并且表扫描会更快。
您可以使用FORCE INDEX
来确保查询使用索引,而不是让优化器确定适当的路径,尽管通常MySQL将采用最有效的方法。
SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
参考:docs