sql - 为什么索引不能加速这个查询?

标签 sql database performance postgresql

我有两个表 usersposts,每个表有 50 万条记录。

我想找到发表了 100 到 200 篇帖子的用户。

我的查询是:

SELECT u.accountid, COUNT(*)
FROM users u
JOIN posts p
ON u.accountid = p.owneruserid
GROUP BY u.accountid
HAVING COUNT(*) BETWEEN 100 AND 200;

我会在大约一秒钟内得到答复。

我分别在 usersposts 表的 accountidowneruserid 字段上添加了索引,但查询没有加快速度。为什么?

最佳答案

HAVING COUNT(*) BETWEEN 100 AND 200;

这部分是解释为什么索引无效的关键。

我们只需要获取成员数在 100 到 200 之间的组。这意味着对于每个组,我们需要精确的成员数。第二点我们没有任何限制(例如 WHERE 部分),因此要获取计数和所有组,我们需要遍历表中的所有记录。

索引B-Tree 索引有助于根据索引条件找到合适的元素(行)。如果数据以某种方式排序(索引提供顺序),我们可以使用二进制搜索来查找所需的子集。但在我们的例子中,我们需要扫描所有记录。所以他们是否订购并不重要。

这就是索引不能加速查询的原因。

关于sql - 为什么索引不能加速这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44046029/

相关文章:

mysql - 如何通过连接具有重复数据的 2 列来留出空间

sql - 如何处理数据库中的并发更新?

MySql、选择、左连接、分组依据、限制..以及我必须在哪里下订单?

python - 如何在使用 Python 插入 MySQL 数据库后获取 "id"?

用于 GAE 的 Java 与 Python

performance - 在 Spacy 中,如何有效地比较一个文档与所有其他文档的相似性?

sql - 如何根据 bool 值更改表格?

mysql - 需要从两个字段中进行选择,第一个字段是唯一的,基于第二个字段的最高值

java - hibernate:通过 xml 进行多对一映射

MySQL MAX() 运行很慢