我有一个具有day_of_week列的用户表,它是一个整数(0 ... 6)。每天我都要运行一个脚本并迭代那天的用户。
那么,我是否应该使用索引标记此列以获得更快的性能?查询将始终返回总数的1/7,我担心如果我添加索引可能会产生相反的效果。想象一下用户表中的10k-100k行。
顺便说一下,如果重要的话我会使用PostgreSQL。
答案 0 :(得分:7)
没有。不要对其进行索引,因为它的cardinality非常低,因此直接表扫描更便宜。如果结果集应该对它进行排序,那么它是值得的。但这取决于其他因素。
当一个值存在于表的总行数的百分之几以上时,对它的查询过滤将必须在索引中找到它后访问表的大多数pages。因此,首先搜索索引是没有意义的,因为这只是双重工作。
答案 1 :(得分:1)
作为一般的经验法则,如果查询将超过表的5%左右,则索引并没有多大意义。但是根据表的属性,还有其他事情要研究。例如,在Postgres中,请查看partitioning。
分区是指将逻辑上的一个大表拆分 变成较小的物理碎片。分区可以提供几个 好处:
在某些情况下,查询性能可以得到显着提升, 特别是当表的大多数访问量很大的行是 在单个分区或少量分区中。该 分区替代索引的前导列,减少 索引大小,使其更有可能是大量使用的部分 索引适合记忆。
当查询或更新访问单个的大部分时 分区,性能可以通过利用来提高 顺序扫描该分区而不是使用索引和随机 访问读取分散在整个表中。
批量加载和删除可以通过添加或删除来完成 分区,如果该需求计划在分区中 设计。 ALTER TABLE NO INHERIT和DROP TABLE都比它快得多 批量操作。这些命令也完全避免了VACUUM 批量删除导致的开销。
很少使用的数据可以迁移到更便宜和更慢的存储介质。
或者说数据永远不会更新,只有插入追加。像位图索引这样的东西可能有意义。