CREATE TABLE as SELECT - 使用 MEMORY ENGINE(在 RAM 内存中)

Posted

技术标签:

【中文标题】CREATE TABLE as SELECT - 使用 MEMORY ENGINE(在 RAM 内存中)【英文标题】:CREATE TABLE as SELECT - using MEMORY ENGINE (in RAM memory) 【发布时间】:2013-12-07 07:20:17 【问题描述】:

我正在阅读有关使用 MEMORY ENGINE 的表(存储在 ram 中的表)。

是否可以使用CREATE TABLE AS SELECT 语法,但我们创建的表是MEMORY ENGINE

MEMORY 表的大小是否有限制?可以创建一个作为 1.5 GB 物理表副本的 MEMORY 表吗?

【问题讨论】:

【参考方案1】:

是的,可以,但不能使用简单的语法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_sizesession 值进行操作,例如

 mysql> SET max_heap_table_size = 24*1024*1024;

【讨论】:

+1。我还记得读过,如果到达max_heap_table,则表会以静默方式写入磁盘。 "实际限制由tmp_table_sizemax_heap_table_size中的较小者确定。如果内存中的临时表超过限制,MySQL会自动将其转换为磁盘MyISAM 表。如果您执行许多高级GROUP BY 查询并且您有大量内存,请增加tmp_table_size 的值(和max_heap_table_size 如有必要)。来源:dev.mysql.com/doc/refman/5.5/en/… @Bad_Neighbor 这是真的,但仅适用于内部临时内存表。 Alma Do 举了一个关于非临时内存表的例子,这也是 OP 所要求的。【参考方案2】:

你也可以这样创建一个临时表:

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。

【讨论】:

以上是关于CREATE TABLE as SELECT - 使用 MEMORY ENGINE(在 RAM 内存中)的主要内容,如果未能解决你的问题,请参考以下文章

Create table as select

oracle中,用create table ... as select * from table_a...语句备份或者其他用途会不会产生归档日志,

CREATE TABLE 表名 AS SELECT 语句

CREATE TABLE 表名 AS SELECT 语句

MySQL中表复制:create table like 与 create table as select

HiveQL/SQL:CREATE TABLE AS SELECT (CTAS) 和 CREATE EXTERNAL TABLE + INSERT INTO 有啥区别?