如何改进insert into select Waiting for table behavior

时间:2015-04-03 07:58:50

标签: mysql select insert locking innodb

我们的数据库是完整的innoDB, 它可以被许多系统访问,其中一些系统会启动一个存储过程,其行为类似:

CREATE  PROCEDURE `fooBar`()
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
CREATE TEMPORARY TABLE temporary_hugeTable LIKE hugeTable;  
CREATE TEMPORARY TABLE temporary__listeId  LIKE fooHugeTableToo;  
INSERT INTO temporary__listeId   SELECT id  FROM   fooHugeTableToo;
INSERT INTO temporary_hugeTable
        SELECT distinct bla, blah, blahh 
        FROM hugeTable
        INNER JOIN temporary__listeId ON temporary__listeId.id =  hugeTable_id
COMMIT;
END

如果同时运行少量查询,则可以,但当多次查询同时运行时,会导致插入堆栈持续存在时间(1小时?)。

其中一个查询的 INSERT INTO temporary_bar SELECT 卡在"发送数据" 状态,而所有其他查询都停留在"等待表" 状态。

使用innoDB时,我们已经推迟了TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,我不知道该怎么做。

注意:我们使用的是mysql 5.0,也许解决方案就在那里(更新到最新版本) NB2:服务器只有4Go或RAM,我认为它正在交换很多临时表正在使用中

1 个答案:

答案 0 :(得分:0)

CREATE  PROCEDURE `fooBar`()
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;


CREATE TEMPORARY TABLE temporary__listeId   SELECT id  FROM   fooHugeTableToo;


CREATE TEMPORARY TABLE temporary_hugeTable 
SELECT distinct bla, blah, blahh 
FROM hugeTable
INNER JOIN temporary__listeId ON temporary__listeId.id =  hugeTable_id
COMMIT;
END

通过这个你不需要写CREATE TEMPORARY TABLE temporary_hugeTable LIKE hugeTable;通过select语句发生的事情所有caloumns都会自动创建那些在select查询中的人