2015-03-02 85 views
0

我在我的數據庫中使用了一個SP,我從之前的一個問題Date Intervals中重用了一個查詢開始日期和結束日期,並返回兩個日期之間的所有日期,然後我執行JOIN到我的訂單表。在MySql中存儲過程的性能

出於某種原因,與SP的查詢超過40秒,不到3秒而不使用SP。

我在這裏做了一些研究,這個答案表明字符集可能有一些事情要做。 SP Performance

歸類連接和數據庫歸類狀態分別爲utf8_general_ci和latin1_swedish_ci,表的歸類爲latin1_swedish_ci。

這裏是我的SQL

call make_intervals('2014-01-29 00:00:00','2015-03-03 00:00:00',1,'DAY'); 

SELECT 
interval_start, 
SUM(TenderedAmt) total 
FROM time_intervals ti 
LEFT JOIN tblorderheaders o 
ON o.OrderDate = ti.interval_start AND (ClientId=35 or ClientId IS NULL) GROUP BY DATE(ti.interval_start) ORDER BY ti.interval_start ASC; 

如果我執行下面的查詢需要0.2秒之內沒有JOIN由程序產生的表。

SELECT SUM(TenderedAmt) total FROM tblorderheaders WHERE ClientId=35 AND (OrderDate>='2014-01-29' AND OrderDate<='2015-02-27') GROUP BY DATE(OrderDate) 

任何人都可以告訴爲什麼這個查詢需要這麼久嗎?

在此先感謝。

+0

你好伴侶,也許沒有索引,並有一個人口稠密的表。 – Avidos 2015-03-02 05:05:38

+0

謝謝。我有我的訂單表由主鍵組合,OrderId和ClientId以及ClientId索引。索引OrderDate是否值得? – 2015-03-02 05:08:18

+0

'ClientId = 35',是否通常是存儲過程中的一個傳遞變量?即'ClientId = @ ClientId' – Simon1979 2015-03-02 05:20:51

回答

0

終於找到問題了! 問題是o.OrderDate被設置爲VARCHAR類型。通過將其更改爲時間戳大大提高了查詢速度。