是否值得索引day_of_week专栏?

时间:2013-03-05 19:00:43

标签: database performance postgresql indexing

我有一个具有day_of_week列的用户表,它是一个整数(0 ... 6)。每天我都要运行一个脚本并迭代那天的用户。

那么,我是否应该使用索引标记此列以获得更快的性能?查询将始终返回总数的1/7,我担心如果我添加索引可能会产生相反的效果。想象一下用户表中的10k-100k行。

顺便说一下,如果重要的话我会使用PostgreSQL。

2 个答案:

答案 0 :(得分:7)

没有。不要对其进行索引,因为它的cardinality非常低,因此直接表扫描更便宜。如果结果集应该对它进行排序,那么它是值得的。但这取决于其他因素。

当一个值存在于表的总行数的百分之几以上时,对它的查询过滤将必须在索引中找到它后访问表的大多数pages。因此,首先搜索索引是没有意义的,因为这只是双重工作。

答案 1 :(得分:1)

作为一般的经验法则,如果查询将超过表的5%左右,则索引并没有多大意义。但是根据表的属性,还有其他事情要研究。例如,在Postgres中,请查看partitioning

  

分区是指将逻辑上的一个大表拆分   变成较小的物理碎片。分区可以提供几个   好处:

     

在某些情况下,查询性能可以得到显着提升,   特别是当表的大多数访问量很大的行是   在单个分区或少量分区中。该   分区替代索引的前导列,减少   索引大小,使其更有可能是大量使用的部分   索引适合记忆。

     

当查询或更新访问单个的大部分时   分区,性能可以通过利用来提高   顺序扫描该分区而不是使用索引和随机   访问读取分散在整个表中。

     

批量加载和删除可以通过添加或删除来完成   分区,如果该需求计划在分区中   设计。 ALTER TABLE NO INHERIT和DROP TABLE都比它快得多   批量操作。这些命令也完全避免了VACUUM   批量删除导致的开销。

     

很少使用的数据可以迁移到更便宜和更慢的存储介质。

或者说数据永远不会更新,只有插入追加。像位图索引这样的东西可能有意义。