【发布时间】:2013-12-07 07:20:17
【问题描述】:
我正在阅读有关使用 MEMORY ENGINE 的表(存储在 ram 中的表)。
是否可以使用
CREATE TABLE AS SELECT语法,但我们创建的表是MEMORY ENGINE?MEMORY 表的大小是否有限制?可以创建一个作为 1.5 GB 物理表副本的 MEMORY 表吗?
【问题讨论】:
标签: mysql
我正在阅读有关使用 MEMORY ENGINE 的表(存储在 ram 中的表)。
是否可以使用CREATE TABLE AS SELECT 语法,但我们创建的表是MEMORY ENGINE?
MEMORY 表的大小是否有限制?可以创建一个作为 1.5 GB 物理表副本的 MEMORY 表吗?
【问题讨论】:
标签: mysql
是的,可以,但不能使用简单的语法CREATE TABLE t AS SELECT ... - 您需要在full statement 中指定表列,示例:
CREATE TABLE t (col1 INT(11), col2 INT(11))
ENGINE=MEMORY
AS
SELECT * FROM another_t
如果16Mb,则默认表的最大大小,但可以通过max_heap_table_size服务器系统变量进行调整。但请注意,此限制是每个引擎,而不是每个表。 IE。您所有的memory 表都会共享它。要限制单个表的大小,您需要对 max_heap_table_size 的 session 值进行操作,例如
mysql> SET max_heap_table_size = 24*1024*1024;
【讨论】:
max_heap_table,则表会以静默方式写入磁盘。
tmp_table_size和max_heap_table_size中的较小者确定。如果内存中的临时表超过限制,MySQL会自动将其转换为磁盘MyISAM 表。如果您执行许多高级GROUP BY 查询并且您有大量内存,请增加tmp_table_size 的值(和max_heap_table_size 如有必要)。来源:dev.mysql.com/doc/refman/5.5/en/…
你也可以这样创建一个临时表:
CREATE TEMPORARY TABLE IF NOT EXISTS tmp ENGINE=MEMORY AS (
SELECT 'abc' As tomcat, 'def' As apache);
或者这样:
CREATE TEMPORARY TABLE IF NOT EXISTS tmp ENGINE=MEMORY AS (
SELECT tomcat, apache From servers);
请注意,第一个选项会将两列创建为 varchar(3),同时第二个选项将从原始表中导入任何列信息,甚至是它们的 cmets。
【讨论】: