在MySql中,當你創建一個臨時表時,例如「CREATE TEMPORARY TABLE ...」,那個表是在內存中還是在磁盤上創建並保存的?在內存或磁盤上是否使用「CREATE TEMPORARY TABLE」創建表?
我已經閱讀了文檔,並且Google已經閱讀並且沒有拿出答案。
在MySql中,當你創建一個臨時表時,例如「CREATE TEMPORARY TABLE ...」,那個表是在內存中還是在磁盤上創建並保存的?在內存或磁盤上是否使用「CREATE TEMPORARY TABLE」創建表?
我已經閱讀了文檔,並且Google已經閱讀並且沒有拿出答案。
這取決於您指定的引擎。默認情況下,表格數據將被存儲在磁盤上。如果您指定了MEMORY引擎,則數據只會存儲在內存中。
在創建臨時表時,應該可以真正查找在文件系統中創建的文件。運行以下命令後:
CREATE TABLE test.table_myisam (x int) ENGINE=MyISAM;
CREATE TABLE test.table_memory (x int) ENGINE=MEMORY;
CREATE TEMPORARY TABLE test.temp_table_myisam (x int) ENGINE=MyISAM;
CREATE TEMPORARY TABLE test.temp_table_memory (x int) ENGINE=MEMORY;
然後我檢查了目錄:C:\ ProgramData \ MySQL的\ MySQL服務器5.5 \ DATA \測試(在Windows上)和文件在場的人:
table_innodb.frm # Table definition. table_innodb.MYD # MyISAM table data file. table_innodb.MYI # MyISAM table index file. table_memory.frm # No MYD or MYI file for the MEMORY engine.
臨時表存儲在C:\ Windows \ Temp中並具有不尋常的名稱,但內部數據以相同的方式存儲。
#sql9a0_7_d.frm # This is the MyISAM temporary table. #sql9a0_7_d.MYD # MyISAM data file for temporary table. #sql9a0_7_d.MYI # MyISAM index file for temporary table. #sql9a0_7_c.frm # This is the MEMORY engine file. No MYD or MYI.
就像馬克說的那樣,它取決於你告訴它使用什麼引擎。如果你不給一個引擎,它會做「某事」,但不一定把它保存在內存中。如果要強制表是在內存中,你必須明確地定義它:
CREATE TEMPORARY TABLE foobar (id int) ENGINE=MEMORY;
但是,使用內存引擎的限制。欲瞭解更多信息,請登錄http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html。
注意(至少在MySQL 5.1.63中)用戶創建的內存臨時表受max_heap_table_size限制,與內部臨時表不同,不會在磁盤上轉換爲磁盤臨時表他們變得太大了。插入更多數據將導致錯誤。 –
上面的鏈接是用於內部臨時表(生成執行一些sql查詢)不用於顯式臨時表的。 –
如果指定'blackhole'引擎,它將被存儲在特殊設備:/ dev/null中。 – Johan
嗯,它們不會在磁盤上被稱爲'temp_table_innodb',因爲臨時表只能通過這一個連接訪問,所以如果你使用兩個單獨的連接到數據庫併爲每個臨時表創建一個表,你可以稱它們爲同樣的事情,他們不會相互碰撞。所有人都說,我不知道他們是在內存還是在磁盤上。我猜,但我毫無疑問會猜錯,所以我不會。 – Kenny
@ Kenny:我發現他們......在臨時文件夾中(當然!)。查看更新的答案。 –