我们的数据库是满的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,我认为它交换了很多时间,大多数临时表都在使用
为什么你需要临时表中的所有caloumns创建?没有解决当前问题,可能有办法解决_real_问题。 – 2015-04-03 10:33:47
临时表是一个“遗留”功能:旧的和过时的软使用它们来读取huges表的部分数据。去除它们是一个痛苦的屁股,因为没有人可以修改需要它们的软... 一个月前,从myisam移到innodb,我们遇到的最后一个问题是存储的线索。 – Bruno 2015-04-03 11:44:53