是在内存中还是在磁盘上使用"CREATE TEMPORARY TABLE"创建的表?

Nat*_*ner 23 mysql memory disk

在MySql中,当您创建临时表时,例如"CREATE TEMPORARY TABLE ...",该表是在内存中还是在磁盘上创建并保存的?

我已经阅读了文档和谷歌,但没有得到答案.

Mar*_*ers 26

这取决于您指定的引擎.默认情况下,表数据将存储在磁盘上.如果指定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;
Run Code Online (Sandbox Code Playgroud)

然后我检查了目录:C:\ ProgramData\MySQL\MySQL Server 5.5\data\test(在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.

  • 如果指定`blackhole`引擎,它将存储在特殊设备中:/ dev/null. (6认同)
  • 好吧,它们不会在磁盘上被称为'temp_table_innodb',因为临时表只能通过这一个连接访问,这样如果你与db建立两个独立的连接并为每个连接创建一个临时表,你可以将它们称为相同事情,他们不会相互碰撞.总而言之,我不知道它们是在内存中还是在磁盘上.我猜,但我无疑猜错了,所以我不会. (2认同)

Ale*_*sen 5

就像马克说的,这取决于你告诉它使用什么 ENGINE。如果您不提供 ENGINE,它会做“某事”,但不一定将其保留在内存中。如果要强制该表在内存中,则必须明确定义它:

CREATE TEMPORARY TABLE foobar (id int) ENGINE=MEMORY;
Run Code Online (Sandbox Code Playgroud)

但是,内存引擎的使用受到限制。有关更多信息,请查看MySQL中的内部临时表使用

  • 上面的链接是用于内部临时表(生成以执行一些 sql 查询)而不是用于显式临时表。 (3认同)
  • 请注意(至少在 MySQL 5.1.63 中)用户创建的内存临时表受 max_heap_table_size 的限制,并且与内部临时表不同,如果/当它们变得太大时,将不会转换为磁盘临时表。插入更多数据会导致错误。 (2认同)