30

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

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

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

请建议我如何进行。

4

4 回答 4

49

对于这样的查询,仅覆盖未同步行的部分索引将提供最佳服务。

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

但是,对于这样的用例,其他同步方法可能更适合从以下开始:

于 2012-08-19T12:47:52.733 回答
20

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

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

于 2012-08-19T14:39:32.300 回答
2

带有记录和布尔字段的表应该是这样做的方法。

这是我认为可能对您有所帮助的东西...

位图索引

PostgreSQL 中位图索引的替代方案

于 2012-08-19T08:05:12.923 回答
1

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

于 2012-08-19T09:07:19.013 回答