是否可以提高此查询的效率?
#!/bin/gnuplot
#
# Plot heat maps
#
unset key
set tic scale 0
set palette defined (0 "black" , 1 "white", 2 "yellow", 3 "red")
set cbrange [0:1]
unset cbtics
set xrange [1:N]
set yrange [N:1] # Not a typo
set term pdf
set output "mat.pdf"
plot 'mat.out' matrix with image
感谢。
答案 0 :(得分:2)
首先,我要使用表别名重写它,所以我可以阅读它:
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
表中的索引快速查找。删除重复项不会有额外的处理。
答案 1 :(得分:1)
可以提供帮助:
DATE_SUB(NOW(), INTERVAL 6 MONTH)
的结果,并在where条件中使用该变量(因为计算最后X个月的函数只执行一次)GROUP BY static.template.name