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_size
的 session 值进行操作,例如
mysql> SET max_heap_table_size = 24*1024*1024;
【讨论】:
+1。我还记得读过,如果到达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/…
@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 内存中)的主要内容,如果未能解决你的问题,请参考以下文章
oracle中,用create table ... as select * from table_a...语句备份或者其他用途会不会产生归档日志,
MySQL中表复制:create table like 与 create table as select
HiveQL/SQL:CREATE TABLE AS SELECT (CTAS) 和 CREATE EXTERNAL TABLE + INSERT INTO 有啥区别?