对 Prices 表中的大量行执行 DELETE 时,DELETE 会逐渐变慢。如果删除 15,000 行,它会在大约 15 秒内运行。20K 行需要 3 或 4 分钟。40,000 行需要 15 分钟,100,000 行运行一个多小时。
下面的 After DELETE 触发器使用可用价格类型的计数更新 Items 表。这用于计算价格以加快生产过程。
两个表都是InnoDB,我把innodb_buffer_pool_size更新为4G,没有效果。
我已经验证所有 SQL 语句都使用索引。Prices 表上有一个PriceType + ItemID 索引,ItemID 是Items 表的主键。
不幸的是,这个架构是由另一个应用程序确定的,我无法修改表结构。我可以修改触发器、索引等。无法更改该应用程序以直接更新 Items 表中的计数。
BEGIN
DECLARE iPriceTypeA INT;
DECLARE iPriceTypeB INT;
DECLARE iPriceTypeC INT;
SET iPriceTypeA = (SELECT COUNT(*) FROM Prices WHERE PriceType='A' AND ItemID=OLD.ItemID),
iPriceTypeB = (SELECT COUNT(*) FROM Prices WHERE PriceType='B' AND ItemID=OLD.ItemID),
iPriceTypeC = (SELECT COUNT(*) FROM Prices WHERE PriceType='C' AND ItemID=OLD.ItemID);
UPDATE …
Run Code Online (Sandbox Code Playgroud)