MYSQL:在存储过程中并行执行多个语句?

时间:2011-06-07 22:17:27

标签: mysql sql

我有一个循环遍历表的过程(procedureA)并使用从该表派生的变量调用另一个过程(procedureB)。

procedureB的每次通话都与最后一次通话无关。

当我运行procedureA时,我的系统资源显示最大CPU使用率50%(我假设我的2个CPU内核中有1个)。

但是,如果我打开mysql终端的两个实例并在两个终端中执行查询,则使用两个CPU核心(CPU使用率可达到接近100%)。

如何在存储过程中实现相同的效果?

我想做这样的事情:

BEGIN
    CALL procedureB(var1); -> CPU CORE #1
    SET var1 = var1+1;
    CALL procedureB(var1); -> CPU CORE #2
END

我知道它不会那么容易...... 有小费吗?

2 个答案:

答案 0 :(得分:2)

在MySQL中,要异步完成某些操作,您必须使用CREATE EVENT,但我不确定是否允许在存储过程中创建一个。{1}}。 (旁注:异步。插入当然可以用INSERT DELAYED完成,但那是1个线程,句点)。

通常情况下,您可以通过程序异步访问几个进程/工作者/守护程序并拥有自己的数据库连接,但这当然不会在同一过程中。

答案 1 :(得分:1)

您可以将自己的守护程序编写为存储过程,并安排多个副本定期运行,例如每5分钟,1分钟,1秒等等。

如果另一个事件副本仍在运行,如果你只想要一次运行N个并行副本,那么

使用具有N个定义良好的锁名称的get_lock()来中止事件执行。

使用“作业表”列出要执行的作业,并使用ID列标识执行顺序。当然,一定要使用良好的事务和锁定实践 - 毕竟这是可重入的编程。

每一行都可以定义要执行的存储过程以及可能的参数。您甚至可以为不同的任务提供多种类型的作业,作业表和工作人员事件。

使用PREPARE和EXECUTE与CALL语句动态调用其名称存储在字符串中的存储过程。

然后根据需要将行添加到作业表中,甚至大批量插入,让工作人员事件尽可能快地处理它们。

之前我已经在Oracle和MySQL中完成了这项工作,而且效果很好。确保处理错误并将其记录到某处,以及成功,就此而言,调试和审计以及性能调整。 N = #CPU可能不是最合适的,具体取决于您的数据和作业类型。我已经看到N = 2xCPU最适合数据密集型任务,其中大量并行磁盘I / O比计算能力更重要。