首页 > 解决方案 > 对联接表进行 GROUP BY 和相等查询的最佳索引

问题描述

我在 postgres 中有这个经常性的 SQL 查询:

SELECT b.name, COUNT(*)
FROM a JOIN b ON a.x = b.x
WHERE a.value = some_value
GROUP BY b.name;

(计算每个 b.name 的 a.value 的出现次数)

有助于提高查询效率的最佳索引是什么?我假设 a.value 上的哈希索引会有所帮助。但是group by呢?有没有一些复合索引解决方案?还是另一种解决方案?

标签: sqlpostgresqlindexinggroup-by

解决方案


永远不要使用NATURAL JOIN. 目前尚不清楚您的查询实际上在做什么。很容易出错。而且最重要的是,所谓的“自然”连接不使用使用外键关系显式声明的自然关系。

让我假设您的查询如下所示:

SELECT b.name, COUNT(*)
FROM a JOIN
     b 
     ON b.x = a.x
WHERE a.value = some_value
GROUP BY b.name;

在大多数数据库中,您需要以下索引:

  • a(value, x)
  • b(x, name)

推荐阅读