我在int字段上的SQL索引不起作用

时间:2019-12-10 14:30:24

标签: mysql sql indexing rds

我有一个带有int列索引的表。

Create table sample(
col1 varchar,
col2 int)

Create index idx1 on sample(col2);

当我解释以下查询时

Select * from sample where col2>2;

进行全表扫描。

为什么索引在这里不起作用?

当表有大约2000万条记录时,如何优化此类查询?

1 个答案:

答案 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