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位行号,无需额外列。 |
构建索引 |
|
|
删除索引 | 删除索引后FTS_DOC_ID列保留。 | 删除索引仅需修改COMMENT,无残留列。 |
空间回收 | 需要手动OPTIMIZE TABLE重建回收,重建需拷贝整个表。 |
|
水平扩展 | 受单实例约束,无法多机执行。 | 受益于PolarDB存算分离,良好水平扩展。 |
DDL限制 | 带全文索引的表无法执行部分DDL。 | 列存全文索引独立,与DDL互不阻塞。 |
缓存 | 全文索引全缓存,命中大数据集时经常遇到缓存不足而失败。 | 元数据常驻+词典LRU。倒排表默认不缓存。 |
写入阶段 | 插入或更新性能显著下降,每次写入需分词并更新辅助表,缓存刷盘时会阻塞后续写入。 | 后台异步增量局部构建,写入性能几乎不受影响。 |
删除阶段 | 删除记DELETED表,并不会真正删除,索引只增不减。 | 利用列存索引的标记删除方式,全文索引不需要额外处理。 |
优化阶段 |
|
|
执行阶段 |
|
|
核心功能
对比维度 | MySQL InnoDB全文索引 | PolarDB IMCI全文索引 |
检索模式 | 支持自然语言模式、布尔模式与查询扩展模式,其中布尔模式支持操作符 | 支持自然语言模式与布尔模式,不支持查询扩展模式,其中布尔模式支持操作符 |
相似度评分 | TF-IDF。 | BM25,开箱即用(构建参数带 |
分词器 | 只支持 |
|
自定义词典 | 不支持分词词典,仅支持停用词表等有限定制。 | 支持自定义词典、停用词表与同义词表等。 |
停用词 | 支持。 | 支持。 |
同义词 | 不支持。 | 支持。 |
分词预览 | 不支持。 | 支持 |
等值加速 | 不支持。 | 支持,通过 |
LIKE加速 | 不支持(LIKE与全文索引独立,无法互相转换加速)。 |
|
JSON加速 | 不支持。 | 支持,通过json分词器为JSON字段的关键路径建立倒排索引,加速 |
性能测试
以下采用Elasticsearch Rally Hub的http_logs数据集(约2.47亿条日志记录)来测试对比MySQL与IMCI列存全文索引的构建和检索能力。
索引构建时间与索引大小
对比维度 | 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大模型能力,实现知识库精准召回与生成。