首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化MySQL更新语句

问优化MySQL更新语句
EN

Database Administration用户
提问于 2019-02-22 07:34:04
回答 2查看 959关注 0票数 0

我有一个更新查询,它从一个表(HST)中选择数据并将其更新到另一个表(PCL)中。PCL表包含大约30000行,而HST表包含约110万行。我在HST上有多个(复合)索引,尽管它是一个大表,但对它的所有查询都相当快(~2-3秒)。但是,当我试图从这个表中选择行并更新PCL时,需要3-4个小时,而且在大多数情况下,我会得到“锁定等待超时;尝试重新启动事务”错误,并且我必须一直尝试直到它工作。

代码语言:javascript
复制
UPDATE PCL 
SET `T2A` = (SELECT HST.`Date` from `HST` WHERE HST.`SYM`=PCL.INST AND 
HST.`DATE` >=  PCL.Date AND HST.`HP` >= PCL.T2 order by HST.`Date` limit 1)    
WHERE `BS` = 'B' AND `T1A` IS NOT NULL; 

是否有办法重写上面的查询,使其运行得更快?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-02-22 08:10:45

想想这样的事情

代码语言:javascript
复制
UPDATE PCL, ( SELECT PCL.SrNo, MIN(HST.Date) minDate
              FROM PCL, HST 
              WHERE HST.SYM=PCL.INST 
                AND HST.DATE >=  PCL.Date 
                AND HST.HP >= PCL.T2 
                AND PCL.BS = 'B' 
                AND PCL.T1A IS NOT NULL
              GROUP BY PCL.SrNo ) subquery
SET PCL.T2A = subquery.minDate
WHERE PCL.SrNo = subquery.SrNo;

当然,两个表上的适当指数都是安全的。

票数 1
EN

Database Administration用户

发布于 2019-02-22 08:56:22

另一种编写此类查询的方法是:

代码语言:javascript
复制
UPDATE PCL AS p
  JOIN HST AS h
    ON h.SrNo = 
       ( SELECT hi.SrNo
         FROM HST AS hi
         WHERE hi.SYM = p.INST
           AND hi.DATE >=  p.Date 
           AND hi.HP >= p.T2
         ORDER BY hi.Date 
         LIMIT 1 
       )    
SET p.T2A = h.Date 
WHERE p.BS = 'B'
  AND p.T1A IS NOT NULL ;
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/230458

复制
相关文章

相似问题

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