2016-04-11 18 views
1

可以使這個查詢更高效嗎?更有效率的內部連接查詢

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) 

謝謝。

+1

你可以在'template_fk'創建一個索引 –

+0

'creation_time'從哪裏來? –

+0

@JohnBoker probedata.probe –

回答

1

能幫:

  1. 如果您在腳本中使用這一說法,在SELECT語句前指定DATE_SUB(NOW(), INTERVAL 6 MONTH)的結果在一個變量,並使用在WHERE條件變量(因爲職能,最後計算X月將執行只有一次)
  2. 相反的不同,試試,看看是否有隻使用select子句(所以沒有明顯的列的改善),並添加GROUP BY static.template.name
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表中的索引快速查找模板表的掃描。將不會有額外的處理來刪除重複項。