我們的數據庫是滿的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