是否可以使此查询更高效?
SELECT DISTINCT(static.template.name)
FROM probedata.probe
INNER JOIN static.template ON probedata.probe.template_fk = static.template.pk
WHERE creation_time >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
谢谢。
最佳答案
首先,我将使用表别名重写它,以便我可以读取它:
SELECT DISTINCT(t.name)
FROM probedata.probe p INNER JOIN
static.template t
ON p.template_fk = t.pk
WHERE creation_time >= DATE_SUB(NOW(), INTERVAL 6 MONTH);
让我做两个假设:
name
在static.template
中是唯一的
creation_time
来自probe
第一个假设特别有用。您可以将查询重写为:
SELECT t.name
FROM static.template t
WHERE EXISTS (SELECT 1
FROM probedata.probe p
WHERE p.template_fk = t.pk AND
p.creation_time >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
);
第二个假设只影响索引。对于此查询,您需要在 probe(template_fk, creation_time)
上建立索引。
如果 template
有宽记录,那么 template(pk, name)
上的索引也可能有用。
这会将执行计划更改为扫描模板表,并使用 probe
表中的索引进行快速查找。不会有额外的处理来删除重复项。
关于mysql - 更高效的内连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36550119/