Ruby on rails 如果一列已经在多列索引中使用,是否应该使用一列索引?

Ruby on rails 如果一列已经在多列索引中使用,是否应该使用一列索引?,ruby-on-rails,ruby,postgresql,ruby-on-rails-4,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 4,我有一个使用postgresql索引优化的查询 (called index1) add_index(:deal, [:partner_id, :partner_status, :deal_user_connect_datetime]) 我在管理面板中有另一个查询,它查询交易模型中的所有合作伙伴 我是否应该像这样创建另一个索引(添加索引(:deal,[:partner\u id]), 只有“partner_id”作为索引的“filter”标准,或者我应该假设,因为它已经是index1中使用的列之

我有一个使用postgresql索引优化的查询

(called index1) add_index(:deal, [:partner_id, :partner_status, :deal_user_connect_datetime])
我在管理面板中有另一个查询,它查询交易模型中的所有合作伙伴

我是否应该像这样创建另一个索引
(添加索引(:deal,[:partner\u id])
, 只有“partner_id”作为索引的“filter”标准,或者我应该假设,因为它已经是index1中使用的列之一,它将重叠/冗余/没有用处,因为数据库已经实现了partner_id上的索引。

像往常一样,答案是“它取决于”可以使用多列索引,因为第一个值是
partner\u id
。但是,如果其他列具有许多不同的值,则仅为该单列创建第二个索引可能更有效


这需要对数据库中的数据进行基准测试和/或提供更多信息。

不,您不应该创建另一个索引——这不是因为它已经是index1中使用的列之一,而是因为它是索引中的前导列,因此它能够基于partner_id优化谓词,就像只针对partner的索引一样_身份证

事实上,在某些情况下可能更好。例如,如果partner\u id可为null,并且您希望使用诸如“partner\u id为null”之类的谓词,则在许多RDBMS上,partner_id上的索引将不可用。但是,如果其他任何列不可为空,则优化程序将知道表中每行的索引中都有partner_id的值,因此可以使用它


多列索引将比单列索引大,但在大多数情况下,与同时存在两个索引相比,这不会对性能造成不利影响,因为这样会使用更多的磁盘空间,需要更多的内存才能有效运行。

感谢您的回答,index1的第二列是一个string只能取3个值,但第三列实际上是一个时间(它可以取任何可能的日期时间,并且每次用户连接到该交易时都会更新,以表示无限多的值)。您的回答引发了我的另一个问题(我是Rails新手!):