性能调优:为布尔列创建索引
Posted
技术标签:
【中文标题】性能调优:为布尔列创建索引【英文标题】: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
),不会被选中。
请建议我如何进行。
【问题讨论】:
【参考方案1】:对于这样的查询,partial index 只覆盖未同步的行将是最好的选择。
CREATE INDEX ON tbl (id) WHERE sync_done = FALSE;
但是,对于这样的用例,其他同步方法可能会更好:
看看LISTEN
/ NOTIFY
。
或将trigger 与dblink 或外部数据包装器(如postgres_fdw
)结合使用(最好)。
或者many available replication methods 之一。Streaming Replication 是在 Postgres 9.0 中添加的,并且变得越来越流行。
【讨论】:
【参考方案2】:我建议您不要索引表(布尔值是低基数字段),而是根据布尔值对其进行分区。
见:http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
【讨论】:
【参考方案3】:如果您的数据库被大量使用,索引肯定会有所帮助,但如果轮询可能会带来负载和并发问题,则可能值得考虑使用通知方法,例如 amqp 或基于触发器/数据库队列的方法,而不是像 Slony或Skytools Londiste。 我已经将 Slony 和 Londiste 用于基于触发器的复制,并且发现它们都非常出色。我更喜欢 Londiste,因为它的设置和管理要简单得多(如果您有一个简单的用例,请坚持使用旧的 2. 分支)。
【讨论】:
【参考方案4】:一个包含记录和布尔字段的表应该是这样做的方法。
这里有一些我认为可能对你有帮助的东西......
Bitmap Index
Alternative of Bitmap Index in PostgreSQL
【讨论】:
Postgresql 现在支持位图索引。 @mlissner:这可能是个误会。 Postgres 中也没有“位图索引”。 Postgres 支持许多不同索引类型的index access method "bitmap index scan"。 但它确实支持布隆过滤器,可以用于类似的情况。以上是关于性能调优:为布尔列创建索引的主要内容,如果未能解决你的问题,请参考以下文章