我们的数据库是完整的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,我认为它正在交换很多临时表正在使用中
答案 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查询中的人