性能调优:为布尔列创建索引

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"。 但它确实支持布隆过滤器,可以用于类似的情况。

以上是关于性能调优:为布尔列创建索引的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL_性能调优目录

[性能调优]在PeopleSoft中使用函数索引

MySQL 性能调优之索引

MYSQL性能调优03_在什么情况下会导致索引失效从而进行全表扫描

Mysql索引性能调优

MySQL 性能调优