2013-01-24 17 views
0

我有一個從第三方產品查詢數據的應用程序。因此,我非常渴望不改變表格結構。如何在不更改基礎表的情況下提高MySQL查詢的性能?

有沒有一種方法可以提高純粹在查詢方面的效率?

我的查詢是:

CallsClosed.Query = @"SELECT COALESCE(ti.FIRST_NAME,'Not Assigned') AS 'Technician', COUNT(*) 'Calls_Closed' 
FROM WorkOrder_Threaded wot 
INNER JOIN WorkOrder wo ON wot.WORKORDERID=wo.WORKORDERID 
LEFT JOIN SDUser sdu ON wo.REQUESTERID=sdu.USERID 
LEFT JOIN AaaUser aau ON sdu.USERID=aau.USER_ID 
LEFT JOIN WorkOrderStates wos ON wo.WORKORDERID=wos.WORKORDERID 
LEFT JOIN SDUser td ON wos.OWNERID=td.USERID 
LEFT JOIN AaaUser ti ON td.USERID=ti.USER_ID 
WHERE (wo.COMPLETEDTIME != 0) AND (wo.COMPLETEDTIME != -1) AND (wo.COMPLETEDTIME IS NOT NULL) 
AND wo.COMPLETEDTIME >= (UNIX_TIMESTAMP(TIMESTAMP('" + sdChartRange.From + @"')) * 1000) 
AND wot.THD_WOID=wot.WORKORDERID 
GROUP BY Technician ORDER BY 'Calls_Closed' DESC"; 

我已經在這個運行JetProfiler,它看起來像的主要罪犯是WOT表的大小。 (約19k行)

任何建議我應該開始加快查詢速度? (目前需要約4秒才能運行)

+3

你計算添加索引作爲改變表結構? – ceejayoz

+0

如果我在別處畫空白,可能會出現這種情況 - 但我試圖避免它,以防萬一我破壞了任何東西! – Ben

+0

被封閉的單詞訂單,他們總會有匹配的用戶嗎?如果這樣INNER JOINs可能會更快。還要考慮在SELECT之前手動計算unix時間戳,而不是在SELECT中進行(我希望MySQL現在對其進行優化,因爲它目前不能保證)。哦,索引是非常重要的,因爲已經建議。 – Kickstart

回答

0
  1. 儘量減少連接數量。
  2. 迴應評論,添加索引。
  3. 查看該查詢的EXPLAIN QUERY結果。
  4. 如果解決了問題,請在fiddle中發佈樣本數據,我會看一看。
+0

感謝你 - 給我開始的地方!這可能是一個愚蠢的問題,但是在使用索引字段的主鍵ID之間存在性能差異?上面所有的連接都使用PK ID,所以不確定索引會如何影響它。 – Ben

+0

@Ben鑑於我沒有看到任何樣本數據,我無法判斷您是否使用了主鍵。 – hd1

0
  • 請確保您在用於選擇和連接的字段上有索引。
  • 檢查不再有效的外鍵('dangling')。