【问题标题】:Performance Tuning: Create index for boolean column性能调优:为布尔列创建索引
【发布时间】:2012-08-15 00:59:47
【问题描述】:

我编写了一个守护进程处理器,它将从一个数据库中获取行并将它们插入另一个数据库以进行同步。它将根据boolean 指示标志sync_done 获取行。

我的表有数十万行。当我选择所有带有sync_done is false 的行时,会导致任何数据库性能问题吗?我是否应该为该 sync_done 列应用索引以提高性能,因为只获取 sync_done 值为 false 的行?

说,我有 10000 行。其中有 9500 个已经同步(sync_done is true),不会被选中。

请建议我如何进行。

【问题讨论】:

    标签: postgresql indexing database-performance database-replication


    【解决方案1】:

    对于这样的查询,partial index 只覆盖未同步的行将是最好的选择。

    CREATE INDEX ON tbl (id) WHERE sync_done = FALSE;
    

    但是,对于这样的用例,其他同步方法可能会更好:

    【讨论】:

      【解决方案2】:

      我建议您不要索引表(布尔值是低基数字段),而是根据布尔值对其进行分区。

      见:http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

      【讨论】:

        【解决方案3】:

        如果您的数据库被大量使用,索引肯定会有所帮助,但如果轮询可能会带来负载和并发问题,则可能值得考虑使用通知方法,例如 amqp 或基于触发器/数据库队列的方法,而不是像 SlonySkytools Londiste。 我已经将 Slony 和 Londiste 用于基于触发器的复制,并且发现它们都非常出色。我更喜欢 Londiste,因为它的设置和管理要简单得多(如果您有一个简单的用例,请坚持使用旧的 2. 分支)。

        【讨论】:

          【解决方案4】:

          一个包含记录和布尔字段的表应该是这样做的方法。

          这里有一些我认为可能对你有帮助的东西......

          Bitmap Index

          Alternative of Bitmap Index in PostgreSQL

          【讨论】:

          • Postgresql 现在支持位图索引。
          • @mlissner:这可能是个误会。 Postgres 中也没有“位图索引”。 Postgres 支持许多不同索引类型的index access method "bitmap index scan"
          • 但它确实支持布隆过滤器,可以用于类似的情况。
          猜你喜欢
          • 2015-08-07
          • 2017-08-15
          • 1970-01-01
          • 1970-01-01
          • 2014-12-14
          • 2018-01-30
          • 1970-01-01
          • 2017-08-10
          • 2022-09-30
          相关资源
          最近更新 更多