IMCI全文索引与社区全文索引差异对比

更新时间:
复制 MD 格式

MySQL InnoDB引擎提供了原生的全文索引(FULLTEXT INDEX)能力,构建在InnoDB行存之上,适合偏静态的小数据量的轻量级文本检索。PolarDB IMCI全文索引是在列存索引(IMCI)之上原生实现的倒排检索能力,采用FST词典和RBM倒排表等现代检索数据结构,内置jieba、ik等中文分词器,目标是在单一数据库内同时满足结构化分析与海量文本检索。本文从技术架构、核心功能、性能表现和适用场景四个维度对比两者的差异,帮助您理解PolarDB IMCI全文索引相较于MySQL社区全文索引的优势。

背景与定位

MySQL InnoDB全文索引构建在InnoDB行存之上,通过一组辅助表(auxiliary tables)维护倒排索引,适合偏静态的小数据量的轻量级文本检索。

PolarDB IMCI全文索引复用列存的存算分离架构、列式存储与向量化执行引擎,采用FST(有限状态转换器)词典和RBM(Roaring Bitmap)倒排表等现代检索数据结构,并内置jieba、ik等中文分词器,目标是在单一数据库内同时满足结构化分析与海量文本检索,避免“数据库+Elasticsearch”外部方案带来的数据同步延迟、架构异构与运维复杂度。

两者最本质的区别在于承载引擎不同:MySQL全文索引建在InnoDB行存之上,并非采用主流倒排索引技术(辅助表B-tree组织,无FST/RBM等现代压缩结构),往往存在性能瓶颈与功能有限等问题。IMCI全文索引建在列存引擎之上,采用与ElasticSearch/Lucene类似的主流倒排索引技术,并利用局部构建方式与标记删除设计及异步合并等方案。这一差异直接决定了两者在数据结构、构建方式、写入开销、查询执行和扩展能力上的全面分化。

技术架构

对比维度

MySQL InnoDB全文索引

PolarDB IMCI全文索引

承载引擎

InnoDB行存。

列存索引(IMCI)。

词典结构

多张辅助表,按首字符排序权重分区,B-tree组织。

FST词典(局部多段),O(L)查找、前缀/后缀压缩。

倒排表结构

辅助表行(词+位置偏移+DOC_ID)。

RBM压缩(Array/Bitmap/RLE三容器+SIMD),以64位行号倒排为主,位图交并。

文档标识

BIGINT类型FTS_DOC_ID列,需建列且可能触发表重建。

列存64位行号,无需额外列。

构建索引

  • 构建全文索引需要重建整表。

  • 分词写入多张表+内存缓存批量刷盘。

  • DDL秒级完成,仅修改列COMMENT,后台异步构建,不阻塞写入。

  • SPIMI单遍+局部词典分段,按内存阈值落盘。

删除索引

删除索引后FTS_DOC_ID列保留。

删除索引仅需修改COMMENT,无残留列。

空间回收

需要手动OPTIMIZE TABLE重建回收,重建需拷贝整个表。

  • 后台异步合并与空间自动回收,无需手动触发。

  • 合并时快照切换且不改原段,不阻塞任何查询与写入。

水平扩展

受单实例约束,无法多机执行。

受益于PolarDB存算分离,良好水平扩展。

DDL限制

带全文索引的表无法执行部分DDL。

列存全文索引独立,与DDL互不阻塞。

缓存

全文索引全缓存,命中大数据集时经常遇到缓存不足而失败。

元数据常驻+词典LRU。倒排表默认不缓存。

写入阶段

插入或更新性能显著下降,每次写入需分词并更新辅助表,缓存刷盘时会阻塞后续写入。

后台异步增量局部构建,写入性能几乎不受影响。

删除阶段

删除记DELETED表,并不会真正删除,索引只增不减。

利用列存索引的标记删除方式,全文索引不需要额外处理。

优化阶段

  • 查询优化阶段会触发辅助表同步(将内存缓存中的数据刷到辅助表),且同步操作持有排他锁会阻塞DML。

  • 在高频写入+间歇查询的场景中尤为致命。

  • 列存执行引擎跳过InnoDB辅助表同步逻辑,零优化阶段开销

  • 列存优化器根据过滤率动态选择算子或表达式执行方式。

执行阶段

  • 行存单点扫描,不支持并行。

  • 当命中高频词时容易出现内存暴涨和查询极慢。

  • 列存向量化、并行、算子高效过滤等

  • 高频词场景下利用RBM压缩+SIMD位图交并运算,海量数据毫秒级。

核心功能

对比维度

MySQL InnoDB全文索引

PolarDB IMCI全文索引

检索模式

支持自然语言模式、布尔模式与查询扩展模式,其中布尔模式支持操作符+(必须包含)、-(必须排除)、*(通配符)、"..."(精确短语)、>/<(提升/降低权重)、~(取反权重)、()(分组)等。

支持自然语言模式与布尔模式,不支持查询扩展模式,其中布尔模式支持操作符+(必须包含)、-(必须排除)、*(通配符)、"..."(精确短语)、()(分组)等。

相似度评分

TF-IDF。

BM25,开箱即用(构建参数带score=1)。

分词器

只支持token/ngram分词,不支持中文语义分词。

  • 支持token/ngram/jieba/ik/json/whole等分词器,原生中文语义分词。

  • 支持json分词用于加速JSON查询。

  • 支持whole分词用于加速等值查询。

自定义词典

不支持分词词典,仅支持停用词表等有限定制。

支持自定义词典、停用词表与同义词表等。

停用词

支持。

支持。

同义词

不支持。

支持。

分词预览

不支持。

支持dbms_imci.fts_tokenize查看分词。

等值加速

不支持。

支持,通过whole分词器为整列字符串构建倒排索引,加速字符串精确匹配(=)、多值精确匹配(IN)与不等值精确匹配(!=)等。

LIKE加速

不支持(LIKE与全文索引独立,无法互相转换加速)。

  • 支持,无需修改SQL,通过ngram分词器构建的倒排索引可将LIKE '%keyword%'查询性能提升数个数量级

  • 支持LIKEMATCH双向自动转换。

JSON加速

不支持。

支持,通过json分词器为JSON字段的关键路径建立倒排索引,加速json_overlaps/json_contains/json_extract等函数。

性能测试

以下采用Elasticsearch Rally Hubhttp_logs数据集(约2.47亿条日志记录)来测试对比MySQLIMCI列存全文索引的构建和检索能力。

索引构建时间与索引大小

对比维度

MySQL InnoDB全文索引

PolarDB IMCI全文索引

构建时间(单线程构建)

1 小时 33 分 43 秒

17 分 53 秒

索引大小

5.1 GB

1.3 GB

查询性能对比

测试使用不同频率的词元在request字段中执行SELECT COUNT(*)操作。

对比维度

高频词元(http)

较高频词元(french)

较低频词元(post)

低频词元(Mozilla)

MySQL InnoDB全文索引

失败

31.81 秒

0.14 秒

0.00 秒

PolarDB IMCI全文索引

2.43 秒

0.26 秒

0.01 秒

0.01 秒

PolarDB IMCI全文索引(4线程)

0.66 秒

0.08 秒

0.01 秒

0.00 秒

说明

上面测试数据仅针对静态数据测试,若存在大量更新情况下,MySQL全文索引查询时间完全不可控,其优化阶段耗时取决于缓存同步到辅助表等时间。

适用场景与选型建议

  • MySQL InnoDB全文索引

    数据量中等(百万级以内文本行)且数据偏静态,并发不高,以英文/西文检索为主,对中文语义分词无要求,希望“随表自带”零额外依赖的轻量全文检索业务,如内容管理系统、小规模英文关键词搜索等。

  • PolarDB IMCI全文索引

    海量文本,需中文语义检索/JSON检索,写入更新频繁,需要高并发低延迟,对数据强一致有要求,兼顾事务处理与高性能全文检索的场景或希望一站式替代“数据库+ElasticSearch”方案的场景。典型包括:

    • 商品搜索:避免ElasticSearch同步延迟(包括数据实时性与一致性)与查询语义割裂(同时编写SQL查询和ES查询逻辑)等,BM25相关性排序+jieba/ik中文分词+自定义词典来匹配自定义商品名。

    • 日志分析:替代ELK(Elasticsearch+Logstash+Kibana)架构,降低组件复杂度、消除写入到可查延迟,结合分区表冷数据归档到OSS降低存储成本。

    • 内容检索:文章、新闻、评论等长文本中文语义检索。

    • 混合检索(RAG):全文索引(BM25精确关键词匹配)+向量索引(语义相似度)联合,结合PolarDB大模型能力,实现知识库精准召回与生成。