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

Posted

技术标签:

【中文标题】表是在内存中还是在磁盘上使用“CREATE TEMPORARY TABLE”创建的?【英文标题】:Are tables created with "CREATE TEMPORARY TABLE" in memory or on disk? 【发布时间】:2011-11-25 12:39:54 【问题描述】:

mysql中,当您创建一个临时表时,例如CREATE TEMPORARY TABLE ...,该表是创建并保存在内存还是磁盘中?

我已通读文档并用 Google 搜索过,但没有找到答案。

【问题讨论】:

【参考方案1】:

这取决于您指定的引擎。默认情况下,表数据将存储在磁盘上。如果指定 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。 好吧,它们不会在磁盘上被称为“temp_table_innodb”,因为临时表只能通过这个连接访问,因此如果您与数据库建立两个单独的连接并使用每个,您可以将它们称为相同的东西,它们不会相互冲突。综上所述,我不知道它们是在内存中还是在磁盘上。我会猜,但我肯定猜错了,所以我不会。 @Kenny:我在临时文件夹中找到了它们(当然!)。查看更新的答案。 好的,我找到了。它们确实存储在磁盘上,如果您查看 my.cnf 文件,请查找 tmpdir 键。在 Debian 默认 mysql 安装中,这似乎设置为 /tmp,所以我创建了一个临时表,并在一个单独的终端中,去查看 /tmp,然后瞧,那里有一个 frm、myd 和 myi 文件。显然,这些文件的名称与临时表的名称完全不同(出于我在上一条评论中所述的原因),但它们就在那里。 [我看到你在我调查的时候也发现了这个;很高兴我们得出了相同的结论:)]【参考方案2】:

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

CREATE TEMPORARY TABLE foobar (id int) ENGINE=MEMORY;

但是,MEMORY-engine 的使用受到限制。欲了解更多信息,请查看Internal Temporary Table Use in MySQL。

【讨论】:

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

以上是关于表是在内存中还是在磁盘上使用“CREATE TEMPORARY TABLE”创建的?的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库怎么把查询出来的数据生成临时表

当运行时修改写入名称节点中的编辑日志文件时,编辑日志文件是在 RAM 还是本地磁盘上更新

Mysql - 脏页

RabbitMQ 消息状态

innodb冷热LRU链表原理

innodb冷热LRU链表原理