2

我有一个领域table_name在表中有一个字段,它只能有 20 个不同的值。表中的总记录约为几万行。如果我做这样的查询:

SELECT * FROM table WHERE table_name = 'adasd'; 

返回的记录最多为总行数的 25%。大多数情况下,我只得到总记录的 10%。这里有索引字段的范围table_name吗?我听说要使索引正常工作,它需要该字段中的值是唯一的或接近它。就我而言,它根本不是独一无二的。但我也听说,如果返回的行数与总行数相比较少,则可以很好地建立索引。

我该怎么办?

4

2 回答 2

3

不,它们不必是唯一的才能从使用索引中受益,但是需要一些时间来考虑 DBMS 在处理查询时会做什么:

全表扫描 - 顺序读取数据(即很少的查找操作)

索引查找 - 在索引上进行几次查找以查找所选数据的开头,然后进行顺序读取(几次查找)以识别基础表中的行,然后进行多次查找以从表中获取行

寻求是昂贵的。

(全表扫描的次要影响是它们更容易将热数据从缓存中刷新 - 但您应该首先解决主要问题)。

在这种情况下,如果索引存在,DBMS 不太可能使用索引,即使这样做,它也可能比全表扫描慢。作为一个(非常)粗略的经验法则,只有当谓词识别的行少于大约 5% 时,您才会从索引中受益(但它会根据索引和数据的相对大小而有所不同) )。

即不要单独在该字段上添加索引。

我认为您可能会从花一些时间思考为什么需要运行返回这么多行的查询中受益?

于 2012-06-26T10:27:31.260 回答
1

修订答案

我刚刚了解到创建索引并不意味着 MySQL 会使用它。记住这一点,我将重新表述我的答案:

如果(一般或您自己的)实践建议您这样做,您应该在该列上创建索引。MySQL 将使用启发式算法;其中包括查看可用索引及其各自的基数,以确定使用或根本不使用索引的最佳索引。

关于这个主题的有趣阅读在这里

于 2012-06-26T10:43:38.843 回答