mysql 中存储过程的并行性?
Parallelism in stored procedure in mysql?
我有一个每天插入几条记录的存储过程。每天按顺序执行相同的逻辑。所以为了提高性能,我在想引入并行性。那么有没有一种方法或者有人可以给我一些例子,我可以在其中并行地 运行 存储过程中的一些逻辑。
编辑:
我在存储过程中使用的查询是:
INSERT INTO tmp (time_interval, cnt, dat, txn_id) SELECT DATE_FORMAT(d.timeslice, '%H:%i') as time_interval
, COUNT(m.id) as cnt
, date(d.timeslice) as dat
, "test" as txn_id
FROM ( SELECT min_date + INTERVAL n*60 MINUTE AS timeslice
FROM ( SELECT DATE('2015-05-04') AS min_date
, DATE('2015-05-05') AS max_date) AS m
CROSS
JOIN numbers
WHERE min_date + INTERVAL n*60 MINUTE < max_date
) AS d
LEFT OUTER
JOIN mytable AS m
ON m.timestamp BETWEEN d.timeslice
AND d.timeslice + INTERVAL 60 MINUTE
GROUP
BY d.timeslice;
此查询每天按小时对记录进行分组并插入 tmp table。所以我想 运行 每天并行查询而不是顺序查询。
谢谢。
d
是一组代表一天 24 小时的 DATETIME 吗?我的直觉说它可以简化很多。可以通过添加 WHERE n BETWEEN 0 AND 23
来加快速度。也许:
SELECT '2015-05-04' + INTERVAL n*60 MINUTE AS timeslice
FROM numbers
WHERE n BETWEEN 0 AND 23
mytable
里有什么?特别是 'old' 数据是静态的还是变化的?如果它是不变的,为什么要反复重新计算呢?仅计算最后一小时,将其存储到永久(不是 tmp)table。不需要并行。
如果数据在变化,最好避免
ON m.timestamp BETWEEN d.timeslice
AND d.timeslice + INTERVAL 60 MINUTE
因为(我认为)它不会优化好。让我们看看 EXPLAIN SELECT...
.
在这种情况下,使用存储过程来计算开始和结束时间并构造(思考 CONCAT
)其中包含常量的 ON 子句。
回到你的问题...
MySQL 本身无法获得并行性。您可以编写单独的脚本来进行并行处理,每个脚本都有自己的参数和连接。
我有一个每天插入几条记录的存储过程。每天按顺序执行相同的逻辑。所以为了提高性能,我在想引入并行性。那么有没有一种方法或者有人可以给我一些例子,我可以在其中并行地 运行 存储过程中的一些逻辑。
编辑: 我在存储过程中使用的查询是:
INSERT INTO tmp (time_interval, cnt, dat, txn_id) SELECT DATE_FORMAT(d.timeslice, '%H:%i') as time_interval
, COUNT(m.id) as cnt
, date(d.timeslice) as dat
, "test" as txn_id
FROM ( SELECT min_date + INTERVAL n*60 MINUTE AS timeslice
FROM ( SELECT DATE('2015-05-04') AS min_date
, DATE('2015-05-05') AS max_date) AS m
CROSS
JOIN numbers
WHERE min_date + INTERVAL n*60 MINUTE < max_date
) AS d
LEFT OUTER
JOIN mytable AS m
ON m.timestamp BETWEEN d.timeslice
AND d.timeslice + INTERVAL 60 MINUTE
GROUP
BY d.timeslice;
此查询每天按小时对记录进行分组并插入 tmp table。所以我想 运行 每天并行查询而不是顺序查询。
谢谢。
d
是一组代表一天 24 小时的 DATETIME 吗?我的直觉说它可以简化很多。可以通过添加 WHERE n BETWEEN 0 AND 23
来加快速度。也许:
SELECT '2015-05-04' + INTERVAL n*60 MINUTE AS timeslice
FROM numbers
WHERE n BETWEEN 0 AND 23
mytable
里有什么?特别是 'old' 数据是静态的还是变化的?如果它是不变的,为什么要反复重新计算呢?仅计算最后一小时,将其存储到永久(不是 tmp)table。不需要并行。
如果数据在变化,最好避免
ON m.timestamp BETWEEN d.timeslice
AND d.timeslice + INTERVAL 60 MINUTE
因为(我认为)它不会优化好。让我们看看 EXPLAIN SELECT...
.
在这种情况下,使用存储过程来计算开始和结束时间并构造(思考 CONCAT
)其中包含常量的 ON 子句。
回到你的问题... MySQL 本身无法获得并行性。您可以编写单独的脚本来进行并行处理,每个脚本都有自己的参数和连接。