我想在MYSQL(亚马逊RDS)中运行多表更新,它非常缓慢。MYSQL多表更新非常缓慢
我在做什么?
基于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 ;
问题是更新查询,它需要很长时间才能在生产服务器上运行。它也锁定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;
STATS
- 临时表:32,000行
- API表:总 - 25万行,where子句后(类型,created_at) 200,000行。
- 该api表具有昂贵的触发器,这就是为什么我把它们关掉 。
- 1000分钟更新运行6分钟。
- 上有API表的主键
显示说明。您可以做的一件事是用JOIN替换子查询,但问题可能是临时表无法索引,您可能更适合使用真正的表,您可以根据需要截断表。 – Mihai