首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL多表更新非常慢

问MYSQL多表更新非常慢
EN

Stack Overflow用户
提问于 2016-11-12 16:26:31
回答 1查看 118关注 0票数 0

我试图在MYSQL (Amazon )中运行一个多表更新,它非常慢。

我想做什么?

根据1小时的时间框架删除所有重复行。

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

代码语言:javascript
复制
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表。

代码语言:javascript
复制
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;

我也尝试过这个版本:

代码语言:javascript
复制
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表:总计- 250,000行,在where子句(type,created_at) 200,000行之后。
  • api表具有昂贵的触发器,这就是我关闭它们的原因。
  • 示例运行1000更新6分钟。
  • api表的主键上有一个索引
EN

回答 1

Stack Overflow用户

发布于 2016-11-12 18:53:13

问题是:

代码语言:javascript
复制
SET @TRIGGER_DISABLED = 1;

没有禁用触发器。我不得不删除api表上的更新触发器,更新运行时间为1.3秒。

在运行查询时,对禁用触发器的最佳方法有帮助吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40564983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档