我在数据库中使用了一个 SP,我在上一个问题 Date Intervals 中重复使用了该 SP查询开始日期和结束日期并返回两个日期之间的所有日期,然后我将其连接到我的订单表。
由于某种原因,使用 SP 的查询需要超过 40 秒,而没有使用 SP 的查询需要不到 3 秒。
我在这里做了一些研究,这个答案表明字符集可能与此有关。 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;
如果我执行以下查询,则无需 JOIN 到过程生成的表,它就会在 0.2 秒内完成。
SELECT SUM(TenderedAmt) total FROM tblorderheaders WHERE ClientId=35 AND (OrderDate>='2014-01-29' AND OrderDate<='2015-02-27') GROUP BY DATE(OrderDate)
谁能告诉我为什么这个查询需要这么长时间吗?
提前致谢。
最佳答案
终于找到问题了! 问题是 o.OrderDate 设置为 VARCHAR 类型。通过将其更改为时间戳,极大地提高了查询速度。
关于mysql - MySql 中的存储过程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28802912/