【问题标题】:Is it worth Indexing day_of_week column?是否值得索引 day_of_week 列?
【发布时间】:2013-02-20 08:00:56
【问题描述】:

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

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

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

【问题讨论】:

  • 有“谎言、该死的谎言和基准”……但也有“人和他们的意见”。更信任基准:)。即尝试、基准测试、恢复索引或保留它。
  • 我建议从您的数据库层中获取这种逻辑。应用程序应该处理这类事情。
  • @Droogans 不。确实,数据库是解决这个问题的正确地方。

标签: database performance postgresql indexing


【解决方案1】:

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

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

【讨论】:

  • 如果您能稍微描述一下“表扫描更便宜”,那就太好了。谢谢:)
  • 虽然我同意这可能不值得,但我们还应该提到 PostgreSQL 9.2 最终引入了仅索引扫描(取决于 vaccum),在这种情况下可以用来提高性能(取决于列查询)。只是为了完整起见而提到。
  • @Markus 在这种情况下不是。顾名思义,index only scan 只会扫描唯一存在的数据是星期几的索引。由于需要的数据在表上,因此它不会是仅索引扫描,因为必须扫描表。
  • @Clodoaldo Neto 当然,您需要将所需的(选定的)列添加到此索引!如果这些只是在小的数字列上,那可能是值得的。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多