如何对聚合进行过滤以有效地使用索引?

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 显示执行计划。

【讨论】:

以上是关于如何对聚合进行过滤以有效地使用索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地对齐 VBA 中的顶点以进行索引渲染?

ES聚合过滤与排序

Elasticsearch:运用 Java 对索引进行 nested 搜索

Elasticsearch:运用 Java 对索引进行 nested 搜索

如何以索引方式有效地存储所有 OpenStreetMap 数据?

如何有效地过滤由两列groupby操作获得的数据帧,以仅包含第二个索引的最大值和最小值?