选择适当的db索引

时间:2016-07-15 02:14:45

标签: postgresql indexing

我的Postgres数据库中有一个包含超过10万个元组的表,我将要查询。有3个字段,“图层”整数,“时间”和“cnt”。许多记录共享“层”的相同值(分布在0到大约5左右,大大集中在0-2之间)。 “时间”具有相对独特的值,但在查询期间,将操纵值以使某些值重复,然后将它们分组以考虑这些重复项。 “cnt”只是用来算数。

我试图在某些时间(WHERE时间< = y AND time> = z)之间查询某些图层(WHERE layer = x)的记录,并且我将使用“time”作为我的GROUP BY字段。我目前有4个索引,分别是(时间),(层),(时间,层)和(层,时间),我相信这太多了(我从我的主管提供的模板中复制了这个)。 / p>

根据我在线阅读的内容,具有相对独特值的字段以及经常搜索的字段是索引编制的理想选择。我也看到索引太多会影响查询的性能,这就是为什么我知道我需要放弃一些。

这让我相信最好的索引选择会是(时间,层)(我假设btree很好,因为我还没有看到使用其他任何东西的理由),因为虽然我在层上查询的次数稍多,时间更符合具有更多相对独特价值的标准。或者,我应该只有2个索引,1个在层上,1个在时间上吗?

此外,(时间,层)的索引是否与(层,时间)有什么不同?因为这是导致我有这么多指数的混乱之一。提供的模板有多个具有相同3个属性的索引,只是以不同的顺序排列......

1 个答案:

答案 0 :(得分:2)

您的where条款似乎是:

WHERE layer = x and time <= y AND time >= z

对于此查询,您需要(layer, time)上的索引。您可以在索引中包含cnt,以便索引涵盖查询 - 也就是说,所有数据列都在索引中,因此不需要访问原始数据页面(它们可能是锁定信息所需的。)

原始的四个索引是冗余的,因为不需要单列索引。创建所有四个的建议不是好建议。但是,(layer, time)(time, layer)是不同的索引,在某些情况下,同时拥有这两个索引是个好主意。