4

我有一个包含 day_of_week 列的用户表,它是一个整数(0...6)。每天我都必须运行一个脚本并遍历当天的用户。

那么,我应该用索引标记此列以获得更快的性能吗?查询总是会返回总数的1/7,如果我添加索引,恐怕会出现相反的效果。想象一下 users 表中有 10k-100k 行。

顺便说一句,如果重要的话,我正在使用 PostgreSQL。

4

2 回答 2

7

不。不要索引它,因为它的基数非常低,所以直接表扫描更便宜。只有对结果集进行排序才值得。但这将取决于其他因素。

当一个值出现在表的总行数的百分之几中时,对它的查询过滤将不得不在索引中找到它们后访问表的大部分页面。所以首先搜索索引是没有意义的,因为这只是双重工作。

于 2013-03-05T19:02:35.963 回答
1

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

分区是指将逻辑上是一张大表拆分为较小的物理块。分区可以提供几个好处:

在某些情况下,查询性能可以显着提高,特别是当表的大部分访问量很大的行位于单个分区或少数分区中时。分区替代了索引的前导列,减少了索引大小,并使索引的大量使用部分更有可能适合内存。

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

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

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

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

于 2013-03-05T19:28:19.350 回答