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

how to make filtering of aggregation to use index efficiently?

我有这个查询http://sqlfiddle.com/#!9/f71a90f/1/0

我根据给定的报价计算访问者总心跳的平均值

我想过滤结果,让我的心跳总数平均超过 5

查询与 HAVING 一起工作,但它运行在所有 table 上,并使其在给出 11 rows (1300 rows in the actual production base code) 的执行计划中效率低下,而结果仅为 3 rows

我在 table 上有 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

就其价值而言,您没有任何 WHERE 子句。 MySQL 因此必须检查两个表中的所有行以生成查询描述的结果集。 HAVING 子句,因为它们过滤聚合函数的结果,如 AVG(),通常不会让查询计划器避免扫描表。

它已经充分利用了您的索引。请参阅显示执行计划的 this fiddle