【问题标题】:Database where filter using compound index使用复合索引过滤的数据库
【发布时间】:2018-01-17 15:14:34
【问题描述】:

我有一个like 对象,可以用来保持对任何其他数据库表的喜欢,每个表都由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 子句,这可能会导致速度变慢,但数据库引擎应该足够聪明来处理它,所以这就是我在这里的原因。

【问题讨论】:

    标签: postgresql indexing relational-database database-indexes


    【解决方案1】:

    我会推荐

    CREATE INDEX ON like(object_id);
    

    这假设object_id 是选择性的(表中有许多不同的object_ids)并且content_type_idlike 是非选择性的。

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

    如果 like 分布不均匀(例如,所有值的 99% 都吃掉了 TRUE),将其添加到索引中也可能会有所帮助。

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

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2018-05-14
      • 2020-11-09
      • 2019-04-28
      • 2020-06-09
      相关资源
      最近更新 更多