在 Postgres 中优化 SQL 联接的索引

Indexes for optimising SQL Joins in Postgres

给定以下查询

SELECT * FROM A 
INNER JOIN B ON (A.b_id = B.id) 
WHERE (A.user_id = 'XXX' AND B.provider_id = 'XXX' AND A.type = 'PENDING') 
ORDER BY A.created_at DESC LIMIT 1;

查询中的变量值为A.user_idB.provider_id,类型总是在'PENDING'上查询。

我打算在 A 上添加 compound + partial 索引 A(user_id, created_at) where type = 'PENDING'

还有A >> B中的记录数。

给定 A.user_idB.provider_idA.b_id 都是外键。有什么方法可以优化查询吗?

鉴于您正在进行内部连接,我首先将查询表达如下,连接方向相反:

SELECT *
FROM B
INNER JOIN A ON A.b_id = B.id
WHERE A.user_id = 'XXX' AND A.type = 'PENDING' AND
      B.provider_id = 'XXX'
ORDER BY
    A.created_at DESC
LIMIT 1;

然后我将以下索引添加到 A table:

CREATE INDEX idx_a ON A (user_id, type, created_at, b_id);

这个四列索引应该涵盖从 BA 的连接,以及 WHERE 子句和 ORDER BY 末尾的排序询问。请注意,我们可能还保留了您上面最初写的带有连接顺序的查询,并且仍然可以使用该索引。