有人有任何建议如何实现这一点吗?
表 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
创建为可以从现有数据重新创建的内存中类型(例如,将其快照与最大 PKtable1
一起保留,并在需要重新启动数据库时前滚(。由于您需要将每个INSERT
上的所有行更新为table1
因此它不能很大。 - 下一个研究点是将
INSERT
和UPDATE
放入由插入逻辑调用的存储过程中。这将使失控的情况以及由此产生的锁定地狱追赶的可能性大大降低。