2015-03-02 56 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类型。通过将其更改为时间戳大大提高了查询速度。