Mysql 是否使用“创建表”;“创建临时表”;内存还是磁盘?

Mysql 是否使用“创建表”;“创建临时表”;内存还是磁盘?,mysql,memory,disk,Mysql,Memory,Disk,在MySQL中,当您创建一个临时表时,例如,create temporary table…,该表是在内存中还是磁盘上创建和保存的 我已经阅读了这些文档,并用谷歌搜索了它,但还没有找到答案。这取决于您指定的引擎。默认情况下,表数据将存储在磁盘上。如果指定内存引擎,数据将仅存储在内存中 在创建临时表时,应该能够实际找到文件系统中创建的文件。运行以下命令后: CREATE TABLE test.table_myisam (x int) ENGINE=MyISAM; CREATE TABLE test.

在MySQL中,当您创建一个临时表时,例如,
create temporary table…
,该表是在内存中还是磁盘上创建和保存的


我已经阅读了这些文档,并用谷歌搜索了它,但还没有找到答案。

这取决于您指定的引擎。默认情况下,表数据将存储在磁盘上。如果指定内存引擎,数据将仅存储在内存中

在创建临时表时,应该能够实际找到文件系统中创建的文件。运行以下命令后:

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 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. 表_innodb.frm#表定义。 表_innodb.MYD#MyISAM表数据文件。 表_innodb.MYI#MyISAM表索引文件。 表_memory.frm#内存引擎没有MYD或MYI文件。 临时表存储在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. #sql9a0_7_d.frm#这是MyISAM临时表。 #临时表的sql9a0_7_d.MYD#MyISAM数据文件。 #临时表的sql9a0_7_d.MYI#MyISAM索引文件。 #sql9a0_7_c.frm#这是内存引擎文件。没有MYD或MYI。
就像马克说的,这取决于你告诉它使用什么发动机。如果你不给一个引擎,它会做一些“事情”,但不一定只是把它保存在内存中。如果要强制表位于内存中,则必须显式定义它:

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

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

如果您指定
黑洞
引擎,它将存储在专用设备:/dev/null中。好的,它们不会在磁盘上被称为“temp\u table\u innodb”,因为临时表只能通过这一个连接访问,这样,如果您与数据库建立了两个独立的连接,并且每个连接都建立了一个临时表,那么您可以调用相同的东西,并且它们不会相互冲突。总而言之,我不知道它们是在内存中还是在磁盘上。我猜,但毫无疑问我猜错了,所以我不会。@Kenny:我找到他们了。。。在临时文件夹中(当然!)。看更新的答案。好的,我找到了。它们确实存储在磁盘上,如果查看my.cnf文件,请查找tmpdir密钥。在Debian默认的mysql安装中,它似乎被设置为/tmp,所以我创建了一个临时表,在一个单独的终端中,查看/tmp,你会发现,那里有一个frm、myd和myi文件。显然,这些文件的名称与临时表的名称完全不同(这是我在上一篇评论中提到的原因),但它们确实存在。[我看到你在我调查时也发现了这一点;很高兴我们得出了相同的结论:)]请注意(至少在MySQL 5.1.63中)用户创建的内存临时表受max_heap_table_size的限制,并且与内部临时表不同,如果/当它们变得太大时,将不会转换为磁盘上的临时表。插入更多数据将导致错误。上面的链接用于内部临时表(生成以执行某些sql查询),而不是显式临时表。