跳至主要内容
跳至主要内容

内存表引擎

注意

在使用 ClickHouse Cloud 上的内存表引擎时,数据不会跨所有节点复制(按设计)。为了保证所有查询都路由到同一个节点,并且内存表引擎能够按预期工作,您可以执行以下操作之一:

  • 在同一个会话中执行所有操作
  • 使用使用 TCP 或原生接口(支持粘性连接)的客户端,例如 clickhouse-client

内存引擎以未压缩的形式将数据存储在 RAM 中。数据以与读取时接收到的完全相同的方式存储。换句话说,从该表读取是完全免费的。并发数据访问是同步的。锁是短的:读写操作不会相互阻塞。不支持索引。读取是并行化的。

在简单查询上可以达到最大的生产力(超过 10 GB/sec),因为没有从磁盘读取、解压缩或反序列化数据。(我们应该注意到,在许多情况下,MergeTree 引擎的生产力几乎一样高。)在服务器重新启动时,表中的数据会消失,表将变为空。通常,使用此表引擎是不合理的。但是,它可以用于测试,以及在相对较少数量的行(大约 100,000,000)上需要最大速度的任务。

内存引擎被系统用于带有外部查询数据的临时表(请参阅“外部数据用于处理查询”部分),以及用于实现 GLOBAL IN(请参阅“IN 运算符”部分)。

可以指定上限和下限来限制内存引擎表的大小,从而有效地使其充当循环缓冲区(请参阅 引擎参数)。

引擎参数

  • 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

用法

初始化设置

CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 100, max_rows_to_keep = 1000;

修改设置

ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;

注意: bytesrows 限制参数可以同时设置,但是,将遵守 maxmin 的下限。

示例

CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_bytes_to_keep = 4096, max_bytes_to_keep = 16384;

/* 1. testing oldest block doesn't get deleted due to min-threshold - 3000 rows */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 8'192 bytes

/* 2. adding block that doesn't get deleted */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 1'024 bytes

/* 3. testing oldest block gets deleted - 9216 bytes - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 8'192 bytes

/* 4. checking a very large block overrides all */
INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 65'536 bytes

SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase();
┌─total_bytes─┬─total_rows─┐
│       65536 │      10000 │
└─────────────┴────────────┘

同样,对于行

CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 4000, max_rows_to_keep = 10000;

/* 1. testing oldest block doesn't get deleted due to min-threshold - 3000 rows */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 1'600 rows

/* 2. adding block that doesn't get deleted */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 rows

/* 3. testing oldest block gets deleted - 9216 bytes - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 rows

/* 4. checking a very large block overrides all */
INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 rows

SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase();
┌─total_bytes─┬─total_rows─┐
│       65536 │      10000 │
└─────────────┴────────────┘
    © . This site is unofficial and not affiliated with ClickHouse, Inc.