我有两个表 users
和 posts
,每个表有 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;
我会在大约一秒钟内得到答复。
我分别在 users
和 posts
表的 accountid
和 owneruserid
字段上添加了索引,但查询没有加快速度。为什么?
最佳答案
HAVING COUNT(*) BETWEEN 100 AND 200;
这部分是解释为什么索引无效的关键。
我们只需要获取成员数在 100 到 200 之间的组。这意味着对于每个组,我们需要精确的成员数。第二点我们没有任何限制(例如 WHERE 部分),因此要获取计数和所有组,我们需要遍历表中的所有记录。
索引B-Tree 索引有助于根据索引条件找到合适的元素(行)。如果数据以某种方式排序(索引提供顺序),我们可以使用二进制搜索来查找所需的子集。但在我们的例子中,我们需要扫描所有记录。所以他们是否订购并不重要。
这就是索引不能加速查询的原因。
关于sql - 为什么索引不能加速这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44046029/