更高效的内连接查询

时间:2016-04-11 13:27:33

标签: mysql sql

是否可以提高此查询的效率?

#!/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

感谢。

2 个答案:

答案 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);

让我做两个假设:

  • namestatic.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)

可以提供帮助:

  1. 如果在脚本中使用此语句,请在select语句之前在变量中分配DATE_SUB(NOW(), INTERVAL 6 MONTH)的结果,并在where条件中使用该变量(因为计算最后X个月的函数只执行一次)
  2. 尝试查看是否仅使用select子句中的列进行改进(因此没有区别)并添加GROUP BY static.template.name