数据库在哪里使用复合索引过滤

时间:2018-01-17 15:14:34

标签: postgresql indexing relational-database database-indexes

我有一个类似的对象,可用于保持对任何其他数据库表的喜欢,每个数据库由content_type_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

查询计划是:

Query plan -> Nested Loop Left Join (cost=26563.29..168218.18 rows=1 width=1383) Query plan -> Bitmap Heap Scan on like (cost=26562.86..168209.72 rows=1 width=29) Query plan Recheck Cond: ? Query plan Filter: ? Query plan -> Bitmap Index Scan on like_417f1b1d (cost=0.00..26562.86 rows=1271257 width=0) Query plan Index Cond: ? Query plan -> Index Scan using accounts_user_pkey on accounts_user (cost=0.43..8.45 rows=1 width=1354) Query plan Index Cond: ?

你能发现任何违规行为吗?因为这比预期的要长。 (1.5秒)

我假设因为我拥有的索引不是确切的WHERE子句,这可能会导致速度减慢,但数据库引擎应该足够智能来处理它,所以这就是我在这里的原因。

1 个答案:

答案 0 :(得分:1)

我会推荐

CREATE INDEX ON like(object_id);

这假定object_id具有选择性(表格中有许多不同的object_id),content_type_idlike不具有选择性。

如果content_type_id有许多不同的值,请将其添加到索引中。

如果like未均匀分布(例如,所有值的99%来自TRUE),则可能也有助于将其添加到索引中。

我想提一下,发布这样的截断执行计划根本没有用。我们需要完整的东西。

相关问题