压缩表

随着时间的推移,RT 表可能会碎片化为多个磁盘块和/或被删除但未清除的数据污染,从而影响搜索性能。在这些情况下,需要进行优化。本质上,优化过程会合并磁盘块(N 路合并),并移除之前使用 DELETE 语句删除的文档。

从 Manticore 4 开始,此过程默认自动执行。但是,您也可以使用以下命令手动启动表压缩。

OPTIMIZE TABLE

OPTIMIZE TABLE table_name [OPTION opt_name = opt_value [,...]]

OPTIMIZE 语句会将 RT 表添加到优化队列中,该队列将在后台线程中处理。

‹›
  • SQL
SQL
📋
OPTIMIZE TABLE rt;

优化的磁盘块数量

默认情况下,OPTIMIZE 会将 RT 表的磁盘块合并到小于或等于逻辑 CPU 核心数乘以 2 的数量。

但是,如果表具有带有 KNN 索引的属性,则此阈值不同。在这种情况下,它设置为物理 CPU 核心数除以 2,以提高 KNN 搜索性能。

您还可以使用 cutoff 选项手动控制优化的磁盘块数量。

其他选项包括:

‹›
  • SQL
SQL
📋
OPTIMIZE TABLE rt OPTION cutoff=4;

前台运行

使用 OPTION sync=1(默认为 0)时,命令将在优化过程完成后才返回。如果连接中断,优化将在服务器上继续运行。

‹›
  • SQL
SQL
📋
OPTIMIZE TABLE rt OPTION sync=1;

限制 IO 影响

优化可能是一个漫长且 I/O 强度高的过程。OPTIMIZE 语句会将任务添加到后台工作池中。您可以使用 parallel_chunk_merges 控制并行运行的任务数量,使用 merge_chunks_per_job 控制每个任务合并的块数。优化工作线程可以被 I/O 限流,您可以使用 rt_merge_iopsrt_merge_maxiosize 指令分别控制每秒最大 I/O 数和最大 I/O 大小。

在优化期间,正在优化的 RT 表几乎始终在线,并且可用于搜索和更新。当一对磁盘块成功合并时,表会被短暂锁定,以允许重命名旧文件和新文件并更新表头。

优化集群表

只要 auto_optimize 未被禁用,表就会自动优化。

如果您遇到意外的 SST 或希望集群中所有节点的表二进制相同,您需要:

  1. 禁用 auto_optimize
  2. 手动优化表:

在其中一个节点上,从集群中删除表:

‹›
  • SQL
SQL
📋
ALTER CLUSTER mycluster DROP myindex;

优化表:

‹›
  • SQL
SQL
📋
OPTIMIZE TABLE myindex;

将表重新添加到集群中:

‹›
  • SQL
SQL
📋
ALTER CLUSTER mycluster ADD myindex;

当表重新添加到集群中时,优化过程创建的新文件将被复制到集群中的其他节点。 其他节点上对表的任何本地更改都将丢失。

表数据修改(插入、替换、删除、更新)应:

  1. 延迟,或
  2. 指向正在运行优化过程的节点。

请注意,当表不在集群中时,插入/替换/删除/更新命令应不带集群名称前缀引用它(对于 SQL 语句或 HTTP JSON 请求中的集群属性),否则它们将失败。 一旦表重新添加到集群中,您必须恢复对表的写入操作并再次包含集群名称前缀,否则它们将失败。

在过程中,搜索操作在任何节点上都可以正常使用。

Last modified: May 22, 2026