mysql - MySql 中的存储过程性能

标签 mysql stored-procedures

我在数据库中使用了一个 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/

相关文章:

mysql - mysql慢查询日志中的"COMMIT"与rails应用程序2.3.5

mysql - 将具有相同状态的行分组,直到状态更改

mysql - 使用 MySQL : Compare values in two consecutive records in a table using a timestamp field

sql - 使用Where和if else的存储过程

用于从 WordPress 数据库中删除所有废弃标签的 SQL 查询

mysql - 如何从 MySQL 服务器建立 SSH 隧道

mysql - 带子查询的连接表中的用例

mysql - mysql存储过程中不存在临时表

c++ - 如何从 pqxx 调用重载的远程过程

sql - 为什么我不能在我的存储过程 delete Month 中插入我的表变量,尽管查询产生了结果?