Postgresql 使用复合索引进行筛选的数据库

Postgresql 使用复合索引进行筛选的数据库,postgresql,indexing,relational-database,database-indexes,Postgresql,Indexing,Relational Database,Database Indexes,我有一个like对象,可以用来保存对任何其他db表的like,每个表都由content\u type\u id SELECT * from like LEFT OUTER JOIN "accounts_user" ON ("like"."user_id" = "accounts_user"."id") WHERE ("like"."object_id" = %s AND "like"."content_type_id" = %s AND "like"."like" = %s)` li

我有一个like对象,可以用来保存对任何其他db表的like,每个表都由
content\u type\u id

SELECT * 
from like LEFT OUTER JOIN "accounts_user" 
  ON ("like"."user_id" = "accounts_user"."id") 
WHERE ("like"."object_id" = %s AND "like"."content_type_id" = %s AND "like"."like" = %s)`
like
是一个布尔字段。这个数据库表的最佳索引是什么

操作包括:检查用户是否喜欢某个对象,以及检查哪些用户喜欢哪些对象

我目前的指数是

CREATE INDEX like_417f1b1d ON like USING btree (content_type_id)
CREATE INDEX like_e8701ad5 ON like USING btree (user_id)
CREATE UNIQUE INDEX like_user_id_uniq ON like USING btree (user_id, content_type_id, object_id
)

查询计划为:

查询计划->嵌套循环左连接(成本=26563.29..168218.18行=1宽度=1383)
查询计划->位图堆扫描(成本=26562.86..168209.72行=1宽度=29)
查询计划复核条件:?
查询计划筛选器:?
查询计划->在like_417f1b1d上进行位图索引扫描(成本=0.00..26562.86行=1271257宽度=0)
查询计划索引条件:?
查询计划->使用帐户用户索引扫描帐户用户(成本=0.43..8.45行=1宽度=1354)
查询计划索引条件:?

你能发现任何不规则的地方吗?因为这比预期的时间要长。(1.5秒)

我假设,由于我的索引不是确切的WHERE子句,这可能会导致减速,但DB引擎应该足够聪明来处理它,所以这就是为什么我在这里。

我建议

CREATE INDEX ON like(object_id);
这假设
object\u id
是选择性的(表中有许多不同的
object\u id
s),而
content\u type\u id
like
不是选择性的

如果
content\u type\u id
有许多不同的值,请将其添加到索引中

如果
like
的分布不均匀(例如99%的值为
TRUE
),将其添加到索引中也可能有帮助

我想说的是,发布这样一个截短的执行计划根本没有帮助。我们需要完整的东西