在 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_id
和B.provider_id
,类型总是在'PENDING'
上查询。
我打算在 A 上添加 compound
+ partial
索引
A(user_id, created_at) where type = 'PENDING'
还有A >> B中的记录数。
给定 A.user_id
、B.provider_id
、A.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);
这个四列索引应该涵盖从 B
到 A
的连接,以及 WHERE
子句和 ORDER BY
末尾的排序询问。请注意,我们可能还保留了您上面最初写的带有连接顺序的查询,并且仍然可以使用该索引。
给定以下查询
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_id
和B.provider_id
,类型总是在'PENDING'
上查询。
我打算在 A 上添加 compound
+ partial
索引
A(user_id, created_at) where type = 'PENDING'
还有A >> B中的记录数。
给定 A.user_id
、B.provider_id
、A.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);
这个四列索引应该涵盖从 B
到 A
的连接,以及 WHERE
子句和 ORDER BY
末尾的排序询问。请注意,我们可能还保留了您上面最初写的带有连接顺序的查询,并且仍然可以使用该索引。