使用内存引擎(RAM内存)创建表格并选择。

22

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

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

  • MEMORY表的大小是否有限制?能否创建一个1.5GB物理表的MEMORY副本表?

2个回答

29
  • Yes, it can be done, but not with simple syntax CREATE TABLE t AS SELECT ... - you will need to specify table columns in full statement, Sample:

    CREATE TABLE t (col1 INT(11), col2 INT(11)) 
    ENGINE=MEMORY 
    AS 
    SELECT * FROM another_t
    
  • Maximum size of table by default if 16Mb, but it can be adjusted with max_heap_table_size server system variable. But please, note, that this limit is per engine - not per table. I.e. all your memory tables will share it. To restrict size of individual table, you'll need to operate on session value for max_heap_table_size, like

     mysql> SET max_heap_table_size = 24*1024*1024;
    

7
另外,我记得阅读过,如果达到了max_heap_table的限制,表格会被悄无声息地写入磁盘。 - Mihai Stancu
1
实际限制取决于 tmp_table_sizemax_heap_table_size 中较小的值。如果内存中的临时表超过了限制,MySQL 会自动将其转换为磁盘上的 MyISAM 表。如果您执行许多高级 GROUP BY 查询并且有大量内存,请增加 tmp_table_size(如果需要,也可以增加 max_heap_table_size)的值。 - Bad_Neighbor
1
@Bad_Neighbor 这是确实的,但仅适用于内部临时存储表。Alma Do提供了一个关于非临时存储表的例子,这也是OP所问的。 - thephper

12

你也可以用这种方法创建一个临时表:

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) 的列,而第二个选项将导入原始表中所有列的信息,包括它们的注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接