如何对聚合进行过滤以有效地使用索引?
Posted
技术标签:
【中文标题】如何对聚合进行过滤以有效地使用索引?【英文标题】:how to make filtering of aggregation to use index efficiently? 【发布时间】:2021-12-14 02:01:58 【问题描述】:我有这个问题http://sqlfiddle.com/#!9/f71a90f/1/0
我根据给定的报价计算访问者总心跳的平均值
我想过滤结果,只给我带来高于 5 的总平均心跳
该查询适用于HAVING
,但它运行在所有表上,并使其在执行计划中效率不高,给出11 rows (1300 rows in the actual production base code)
,而结果仅为3 rows
我的桌子上有PRIMARY KEY (id)
和KEY (docid, heartbeat)
,但不知道如何更好地过滤它
SELECT
d.id,
d.content,
AVG(hb.heartbeat) AS beats
FROM
docs d
LEFT JOIN
heartbeats hb
ON hb.docid = d.id
GROUP BY
d.id
HAVING
beats > 5
ORDER BY
beats DESC
【问题讨论】:
【参考方案1】:不管怎样,你没有任何WHERE
子句。因此,mysql 必须检查两个表中的所有行以生成查询描述的结果集。 HAVING
子句,因为它们过滤像 AVG()
这样的聚合函数的结果,所以通常不要让查询规划器避免扫描表。
它已经很好地利用了您的索引。请参阅this fiddle 显示执行计划。
【讨论】:
以上是关于如何对聚合进行过滤以有效地使用索引?的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:运用 Java 对索引进行 nested 搜索
Elasticsearch:运用 Java 对索引进行 nested 搜索