sql - 对联接表进行 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呢?有没有一些复合索引解决方案?还是另一种解决方案?
解决方案
永远不要使用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)
推荐阅读
- c - 当函数/宏之一在代码中时,Keil 会创建“错误”十六进制文件
- laravel - Lumen API 上传文件在 Postman 上工作,在 Android Multipart 上找不到
- python - Elmo 是词嵌入还是句子嵌入?
- erlang - 如何在 Erlang 或 Elixir 中序列化有向图以用于导出目的
- php - 如何显示来自多个模型的数据并将其排序在一个表中(laravel)
- python - 在列表理解中解压缩值
- java - 如何输出数组中元素的索引
- javascript - 等待循环与 Promise.all
- javascript - 将动态模块传递给另一个模块
- makefile - 如何使用带有反向链接的 Makefile 构建 HTML?