Skip to main content
在 ClickHouse Cloud 上使用 Memory 表引擎时,数据不会在所有节点之间复制 (这是设计使然) 。为保证所有查询都路由到同一节点,并让 Memory 表引擎按预期工作,可以采用以下任一方式:
  • 在同一会话中执行所有操作
  • 使用采用 TCP 或原生接口 (这会启用对粘性连接的支持) 的客户端,例如 clickhouse-client
Memory 引擎以未压缩形式将数据存储在 RAM 中。数据会按读取时接收到的原样进行存储。换句话说,从这张表读取数据完全没有开销。 并发数据访问会被同步处理。锁持有时间很短:读写操作彼此不会阻塞。 不支持索引。读取可并行进行。 读取支持 PREWHERE,包括由 optimize_move_to_prewhere 设置控制的 WHERE 条件自动移入:首先只读取过滤条件涉及的列;只有当某个块中有行满足条件时,才会读取其余列,而且只读取满足条件的行。多个条件组成的合取式会分步求值,与启用 enable_multiple_prewhere_read_steps 设置时的 MergeTree 类似:每个后续条件涉及的列,只会针对已通过前面各条件的行进行读取。与 compress = true 配合使用时尤其有益,因为对于选择性较高的条件,大多数列无需解压。不带过滤条件的 SELECT count() FROM table 可直接从元数据获取结果,无需读取数据。 对于简单查询,由于无需从磁盘读取、解压或反序列化数据,可达到最高吞吐量 (超过 10 GB/秒) 。 (需要说明的是,在很多情况下,MergeTree 引擎的吞吐量也几乎同样高。) 服务器重启后,表中的数据会消失,表会变为空。 通常,使用这种表引擎并无充分理由。不过,它可用于测试,以及在行数相对较少 (最多约 100,000,000 行) 但需要最高速度的任务中使用。 系统会将 Memory 引擎用于带有外部查询数据的临时表 (参见”处理查询的外部数据”一节) ,以及实现 GLOBAL IN (参见”IN 运算符”一节) 。 可以指定上下限来限制 Memory 引擎表的大小,从而使其能够充当环形缓冲区 (参见 引擎参数) 。

引擎参数

  • min_bytes_to_keep — 当内存表设置了大小上限时,需保留的最小字节数。
    • 默认值:0
    • 需要 max_bytes_to_keep
  • max_bytes_to_keep — 内存表中保留的最大字节数;每次插入时都会删除最旧的行 (即环形缓冲区) 。如果添加大块时,需删除的最旧一批行会使结果低于 min_bytes_to_keep 限制,则最大字节数可能会超过 указанное 限制。
    • 默认值:0
  • min_rows_to_keep — 当内存表设置了大小上限时,需保留的最小行数。
    • 默认值:0
    • 需要 max_rows_to_keep
  • max_rows_to_keep — 内存表中保留的最大行数;每次插入时都会删除最旧的行 (即环形缓冲区) 。如果添加大块时,需删除的最旧一批行会使结果低于 min_rows_to_keep 限制,则最大行数可能会超过 указанное 限制。
    • 默认值:0
  • compress - 是否压缩内存中的数据。
    • 默认值:false

用法

初始化设置
修改设置
注意: bytes 和 rows 这两个上限参数可以同时设置,不过最终会遵循 max 和 min 中较小的限制值。

示例

此外,对于行: