2015-04-03 25 views
0

我们的数据库是满的InnoDB, 它是由许多SYSTEMES访问,他们中的一些启动存储过程至极的行为类似的东西:如果如何提高INSERT INTO选择等待表行为

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选择卡“发送数据”状态,所有其他人都在“等待表”状态stucked。

使用innoDB时,我们把事务隔离级别读为UNCOMMITTED,我不知道该做什么更多。

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

+0

为什么你需要临时表中的所有caloumns创建?没有解决当前问题,可能有办法解决_real_问题。 – 2015-04-03 10:33:47

+0

临时表是一个“遗留”功能:旧的和过时的软使用它们来读取huges表的部分数据。去除它们是一个痛苦的屁股,因为没有人可以修改需要它们的软... 一个月前,从myisam移到innodb,我们遇到的最后一个问题是存储的线索。 – Bruno 2015-04-03 11:44:53

回答

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语句自动那些谁在选择查询

+0

对不起,但是,我不明白你的答案:因为锁与INSERT ... SELECT, 有关,你的解决方案如何防止锁出现? – Bruno 2015-04-03 12:16:58