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

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

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

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

【问题讨论】:

    标签: mysql


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2010-11-27
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2020-02-08
      • 2021-01-15
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多