cron 或 TRIGGER 持续插入表 1 或 CURSOR(或替代)以更新 1m 行 InnoDB 表2 而不锁定


cron or TRIGGER on continually INSERTing table1 or CURSOR (or alternative) to UPDATE 1m row InnoDB table2 without locking?

有人有任何建议如何实现这一点吗?

表 1 将不断INSERT。 这就需要在表2上的每一行UPDATE在每个表1上INSERT。 此外,我不知道MySQL是否最好负责的算法(相对于PHP计算速度(也必须应用于table2的每一行。

我想让 PHP 在用户执行INSERT时处理它,但我发现 PHP 页面在服务器连接到用户后并不持久(或者我理解,请告诉我这是错误的,这样我就可以走那条路(。

所以现在我的问题是,如果我在TRIGGER中使用总表UPDATE,我会有很多锁(或者我从 InnoDB 的锁定中理解,当UPDAT使用复合主键处理整个表时,因为该键的一部分将被UPDATE d(。

现在,我正在考虑使用 cron 作业,但我宁愿他们在 table1 上的用户INSERT上触发,而不是按计划触发。

所以我在想也许是一个CURSOR...

什么方法最快且"绝对"没有锁定表2?

提前非常感谢!

表结构

表2 是速度的所有INT。 但是,它有一个 2 列主键。 其中 1 列是正在UPDATE d 的内容。 该密钥适用于同样重要的快速SELECT

1 的平均行数约为表 2 的 2.5 倍。

表2实际上非常小,~200MB。

首先:你尝试的几乎是不可能的 - 我不知道 RDBMS,它可以将INSERT s升级到一个表中,并以"绝对不锁定"的方式将s升级到另一个表中的UPDATE s。

可是:

  • 我的第一个研究点是,是否可以对模式进行大修以优化这个热点。
  • 如果无法实现这一点,您可能需要考虑将table2创建为可以从现有数据重新创建的内存中类型(例如,将其快照与最大 PK table1 一起保留,并在需要重新启动数据库时前滚(。由于您需要将每个INSERT的所有行更新为table1因此它不能很大。
  • 下一个研究点是将INSERTUPDATE放入由插入逻辑调用的存储过程中。这将使失控的情况以及由此产生的锁定地狱追赶的可能性大大降低。