复合指数或不复合指数(postgres)

时间:2014-11-07 18:27:13

标签: postgresql indexing

我有一个列表页面正在缓慢加载,我想检查一下我是否有正确的索引。

该表中有500万行。每个列表都属于channel_id。该网页仅显示一个频道的分页,分页,因此第一个'过滤器'始终是' channel_id'。在这些例子中,我将省略偏移和简洁限制。

select * from listings where channel_id = 5;

商家信息也有一个状态列,默认情况下,该页面会在“活动”状态下打开。目录。

select * from listings where channel_id = 5 and status = 'active';

所以我们在(channel_id,status)上创建了一个复合索引。

但我们也希望在UI中过滤并拥有可排序的表列,其中包含一系列其他属性(价格,数量,类型,sku,title,has_errors,has_warnings,created_at,updated_at ......等)

我开始使用所有属性的复合索引,但这并没有多大意义,因为您一次只能从UI对一列进行排序。

postgres文档说:&#34;如果其中一种类型的查询比其他类型的查询少得多,那么您可能只会创建最符合常见类型的两个索引&#34; < / p>

所以听起来我应该创建几个单独的索引而不是一个巨大的复合索引。我的问题是:如果我知道我一次只处理一个频道,那么创建一个索引就更好吗?创建一个索引,或者仍然为每个属性创建复合索引每个索引中的channel_id例如:(channel_id,created_at)和另一个(channel_id,title)等等?

1 个答案:

答案 0 :(得分:1)

  

在这些例子中,我将省略偏移和简洁限制。

但您也省略了与索引相关的order by

  

但我们也希望在UI中过滤并拥有可排序的表列,以及其他一些属性

我们只能为特定查询提供特别建议。

在这种情况下,PostgreSQL Doc的引用是适用的:您可能无法为所有可能的组合创建索引,因此选择最常见的索引并处理它们。

因此,我建议您使用whereorder by条款获取两个最常见的查询,并将其添加到您的问题中。那些我们可以看一看并给出建议。

或者,实际上,您最好开始学习自己编制索引here

最后,请注意分页查询是special field of optimizationoffset通常是一种性能威胁,最好避免使用:请参阅NoOffset(其中包含PostgreSQL基准测试的幻灯片)。