如何进行聚合过滤以有效使用索引?
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。
我有这个查询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。