【发布时间】:2011-11-25 12:39:54
【问题描述】:
在MySQL中,当您创建一个临时表时,例如CREATE TEMPORARY TABLE ...,该表是创建并保存在内存还是磁盘中?
我已通读文档并用 Google 搜索过,但没有找到答案。
【问题讨论】:
在MySQL中,当您创建一个临时表时,例如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 Server 5.5\data\test(在 Windows 上),存在的文件是:
table_innodb.frm # 表定义。 table_innodb.MYD # MyISAM 表数据文件。 table_innodb.MYI # MyISAM 表索引文件。 table_memory.frm # 没有用于 MEMORY 引擎的 MYD 或 MYI 文件。临时表存储在 C:\Windows\Temp 中并且具有不寻常的名称,但在内部以相同的方式存储数据。
#sql9a0_7_d.frm # 这是 MyISAM 临时表。 #sql9a0_7_d.MYD # 临时表的 MyISAM 数据文件。 #sql9a0_7_d.MYI # 临时表的 MyISAM 索引文件。 #sql9a0_7_c.frm # 这是内存引擎文件。没有 MYD 或 MYI。【讨论】:
blackhole引擎,它将被存储在特殊设备中:/dev/null。
就像 Mark 所说,这取决于您告诉它使用什么 ENGINE。如果您不提供 ENGINE,它会做“某事”,但不一定只保留在内存中。如果你想强制表在内存中,你必须明确定义它:
CREATE TEMPORARY TABLE foobar (id int) ENGINE=MEMORY;
但是,MEMORY-engine 的使用受到限制。欲了解更多信息,请查看Internal Temporary Table Use in MySQL。
【讨论】: