2015-04-03 29 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