2016-03-19 86 views
1

我需要關於此sql語句的性能建議。我有兩個「交叉」表(約16000行)和「數據」(約100000行)。問題是性能下降。我需要從「data」中獲取「title」列,其中data.partnum = cross.sku。問題是,我有多個相同的值「data.partnum」,所以我需要的是將結果限制爲僅來自內部連接的第一行。我試着在select語句中使用子查詢,但速度很慢。你可以幫我嗎?我業餘愛好數據庫 - 所以我沒有任何主鍵或索引鍵。由於SQL內部連接性能建議

SELECT '[cross]' 
    , IFNULL(d2.title, "") as title 
    , c2.maker 
    , c2.partnum 
    , c2.price 
    , c2.sku 
FROM `cross` c2 
LEFT JOIN data d2 ON d2.partnum = c2.sku 
WHERE 1=1 
GROUP BY c2.partnum 
+0

您是否爲'sku'和'partnum'創建了索引?性能問題應該包括'EXPLAIN ANALYZE'和一些關於表格大小,索引,當前時間表現,期望時間等的信息。'Slow'是一個相對術語,我們需要一個真實值來比較。 [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

+0

呃!不錯,它工作得更好,我爲sku和partnum創建了索引,非常感謝你! – Strogi

回答

1

這是您的查詢:

SELECT '[cross]', COALESCE(d2.title, '') as title, 
     c2.maker, c2.partnum, c2.price, c2.sku 
FROM `cross` c2 LEFT JOIN 
    data d2 
    ON d2.partnum = c2.sku 
WHERE 1=1 
GROUP BY c2.partnum; 

這顯然表明對data(partnum, title)的索引。但是,查詢有幾個大問題:

  • 什麼是cross.skucross.partnum?在兩個表中(或兩個表中的skujoin條件都不在partnum上真的很奇怪。
  • 聚合的目的是什麼?你沒有聚合功能。
  • 我對COALESCE()有偏好,因爲它是ANSI標準。

如果你想要一個任意匹配title,那麼我會建議相關子查詢,如果cross.partnum是獨一無二的:

SELECT '[cross]', 
     coalesce((select d2.title 
       from data d2 
       where d2.partnum = c2.sku 
       limit 1 
       ), '') as title, 
     c2.maker, c2.partnum, c2.price, c2.sku 
FROM `cross` c2 
WHERE 1=1; 

假設cross.partnum是唯一的(在原缺乏聚合功能的建議查詢),那麼這應該是更快,與索引data(partnum, title)

+0

我投第二個查詢,而不是第一個,因爲它是'最好的'。 –