2013-10-11 23 views
7

我有一個使用的存儲引擎創建的臨時表如下:MySQL的用戶是完全

CREATE TEMPORARY TABLE IF NOT EXISTS some_text (
    id INT DEFAULT 0, 
    string varchar(400) DEFAULT '' 
) engine = memory; 

當我行插入它,我碰上一個#1114錯誤,因爲表已滿。它在mysql文檔中解釋說,更改tmp_table_sizemax_heap_table_size不會爲增加用戶創建的臨時表的大小做任何事情,這正是我想我在這裏所做的。我怎樣才能讓這張桌子變大?

我希望能夠通過調用SET來動態地實現這一點,但我試過設置tmp_table_sizemax_heap_table_size,它們都遠遠超出了我期望的數據量。那麼有誰知道如何解決這個表上的這個錯誤?感謝任何有幫助的人。

回答

9

max_heap_table_size是對使用MEMORY存儲引擎的表(臨時或其他)的大小爲的任何的限制。您必須增加此配置選項才能在表中存儲更多數據。

+0

謝謝比爾,你總是有明確的MySQL的建議。作爲一個說明。我創建這個表作爲存儲過程的一部分。我不知道我是否可以負責任地增加整個數據庫上的'max_heap_table_size'。使用'set max_heap_table_size = 33554432'來爲我的存儲過程設置限制是明智的,然後一旦完成運行就可能將其設置回來?再次感謝。 – usumoio

+1

是的,可以使用會話範圍設置'max_heap_table_size'(參見http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_heap_table_size),以便您可以進行更改影響有限。 –

+1

即使將'max_heap_table_size'和'tmp_table_size'增加到4G,我也會收到「完整」消息! –

3

在MySQL中,默認情況下,與存儲引擎創建臨時表可以快速增長超過最大堆表大小TMP-表大小的16MB的限制,因爲更多的內存每行分配比通常要求的要多。在您提供的示例中,VARCHAR(400)將根據最大字符串大小分配內存,而不是數據的實際大小。每個字符可能需要多於1個字節的存儲空間。假設每行需要2kb,那麼只需要8k行即可達到極限。

對於許多應用程序,這個問題可以通過使用ROW_FORMAT = DYNAMIC如下解釋解決:

http://www.percona.com/doc/percona-server/5.5/flexibility/improved_memory_engine.html