gpt4 book ai didi

MYSQL多表更新极慢

转载 作者:行者123 更新时间:2023-11-29 20:00:07 24 4
gpt4 key购买 nike

我尝试在 MYSQL (Amazon RDS) 中运行多表更新,但速度非常慢。

我想做什么?

根据 1 小时的时间范围删除所有重复的行。

下面我创建了一个临时表来识别表中的重复行。此查询将在 2 秒内运行。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

CREATE TEMPORARY TABLE tmpIds (id int primary key);
INSERT into tmpIds
SELECT distinct
d.id
FROM api d INNER JOIN api orig
on d.domain_id = orig.domain_id and d.user_id = orig.user_id
WHERE
orig.created_at < d.created_at
AND d.created_at <= DATE_ADD(orig.created_at, Interval 1 hour)
AND d.type = 'api/check-end'
AND d.created_at >= '2016-08-01';

SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;

问题是 UPDATE 查询在生产服务器上运行需要很长时间。它还锁定 api 表。

SET @TRIGGER_DISABLED = 1;

UPDATE
api
SET
deleted_at = now()
WHERE type = 'api/check-end' AND created_at >= '2016-08-01'
AND id IN (SELECT id FROM tmpIds);

SET @TRIGGER_DISABLED = 0;

我也尝试过这个版本:

SET @TRIGGER_DISABLED = 1;

UPDATE
api a,
tmpIds ti
SET
a.deleted_at = now()
WHERE
type = 'api/check-end' AND created_at >= '2016-08-01' AND a.domain_id < 10 AND a.id = ti.id;

SET @TRIGGER_DISABLED = 0;

统计

  • 临时表:32,000 行
  • api 表:总计 - 250,000 行,位于 where 子句(类型、created_at)之后200,000 行。
  • api 表有昂贵的触发器,这就是我转动它们的原因关闭。
  • 示例运行 6 分钟 1000 次更新。
  • api表主键有索引

最佳答案

问题在于以下语句:

SET @TRIGGER_DISABLED = 1;

没有禁用触发器。我必须删除 api 表上的 UPDATE 触发器,并且 UPDATE 在 1.3 秒内运行。

有关运行查询时禁用触发器的最佳方法有什么帮助吗?

关于MYSQL多表更新极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40564983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com