MySQL-在实时服务器上执行密集查询

| 我在处理更新和在MySQL数据库中插入数百万行时遇到一些问题。我需要标记表A中的5000万行,将标记的5000万行中的一些数据插入表B,然后再次更新表A中的这5000万行。表A中约有1.3亿行,表B中有8000万行。 这需要在实时服务器上发生,而不能拒绝从网站访问其他查询。问题是当此存储过程正在运行时,来自网站的其他查询最终被锁定,并且HTTP请求超时。 这是SP的要点,出于说明目的进行了一些简化:
CREATE DEFINER=`user`@`localhost` PROCEDURE `MyProcedure`(  
  totalLimit  int
)
BEGIN
  SET @totalLimit = totalLimit; 
  /* Prepare new rows to be issued */
  PREPARE STMT FROM \'UPDATE tableA SET `status` = \"Being-Issued\" WHERE `status` = \"Available\" LIMIT ?\';
  EXECUTE STMT USING @totalLimit;
  /* Insert new rows for usage into tableB */
  INSERT INTO tableB (/* my fields */)
    SELECT /* some values from TableA */ 
    FROM tableA
    WHERE `status` = \"Being-Issued\";
  /* Set rows as being issued */
  UPDATE tableB SET `status` = \'Issued\' WHERE `status` = \'Being-Issued\';
END$$

DELIMITER ;
    
已邀请:
无论您在做什么,处理3千万行的速度都会变慢。 确保您的更新影响较小的不交集。然后逐个执行它们,而不是在同一事务中逐个执行它们。 如果您已经在执行此操作,而MySQL行为不正常,请尝试对您的代码进行以下微调:
create a temporary table

begin

insert into tmp_table
select your stuff
limit ?
for update

do your update on A using tmp_table

commit

begin
do your insert on B using tmp_table
do your update on A using tmp_table
commit
这应该将锁保持最短的时间。     
那这个呢?它基本上在循环中调用原始存储过程,直到达到所需的总量为止,并且在两次调用之间有一个睡眠时间(例如2秒)以允许其他查询进行处理。
increment
是一次的金额(在这种情况下为10,000)
totalLimit
是要处理的总金额
sleepSec
是通话之间的休息时间
BEGIN
SET @x = 0;
REPEAT
    SELECT SLEEP(sleepSec);
    SET @x = @x + increment;
    CALL OriginalProcedure( increment );

    UNTIL @x >= totalLimit
END REPEAT;
END$$
显然,它可以使用一些数学运算来确保增量(如果不能被平均整除)不会超过总限制,但它似乎可以工作(按工作方式,我是指允许仍然从Web请求中处理其他查询),并且整体上似乎也更快。 这里有什么见识吗?这是一个好主意吗?馊主意?     

要回复问题请先登录注册