我有一个循环遍历表的过程(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
我知道它不会那么容易...... 有小费吗?
答案 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比计算能力更重要。