大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

最近信创国产化的讨论越来越热,很多DBA同行都在问同一个问题:原来的MySQL要替换,国产数据库到底选哪个?它们的索引能力怎么样?跟MySQL比有什么差异?

为什么突然要对比这些数据库?

这两年数据库圈最大的变化,就是“选型”这件事变得前所未有地复杂。MySQL 5.7停更、信创国产化加速、云原生和分布式架构普及,再加上AI应用带来的向量检索等新需求,让DBA不再只需要守着一种数据库过日子。面对MySQL、PostgreSQL和越来越多的国产数据库,理解它们在核心能力——尤其是索引上的差异,已经成了选型前必须做的功课。今天这篇,就把这几家的索引底牌摊开来看。

索引到底是什么?

聊对比之前,先把索引这事说明白。

索引就是数据库的“目录”。没有目录,你要一页页翻(全表扫描);有了目录,直接翻到第几页(索引快速定位)。但目录也会占地方,每加一页目录,书的厚度就增加一点——这就是索引的存储和维护成本。一个表索引建议不超过5~6个,否则写入会明显变慢。

常见的索引类型有这几种:

  • B-Tree​:最常用的万金油,支持等值、范围、排序。绝大多数OLTP场景用它就够了。
  • Hash索引​:只支持精确等值查询,不支持范围或排序。使用场景较窄。
  • 全文索引​:用于文本关键词搜索,比如文章内容、商品描述。
  • 空间索引​:用于地理坐标、多边形包含等GIS查询。
  • 位图索引​:适合低基数列(如性别、状态),多条件组合查询效率高,但频繁更新的场景不适合。
  • GIN索引​(PostgreSQL系独有):适合JSONB、数组等多值类型,配合JSONB查文档数据非常快。
  • BRIN索引​(PostgreSQL系独有):针对超大表(如时序数据)设计,只存数据块的统计摘要,空间占用极小。

MySQL 8.0 的索引能力

MySQL 8.0的主要索引类型:B-Tree(默认)、Hash(仅MEMORY引擎)、全文索引、空间索引。

8.0版本新增了几个实用特性:

  • 降序索引​:8.0之前虽然语法支持ORDER BY column DESC,但实际上还是按升序存储的。8.0开始真正原生支持降序索引,ORDER BY column DESC查询不再需要额外排序。
  • 函数索引​:8.0.13起支持。以前如果在查询中对索引列加了函数(如WHERE UPPER(name) = 'ABC'),索引会失效。现在可以对UPPER(name)建索引。
  • 不可见索引​:可以把索引设为优化器不可见,用于验证删除索引的影响,但索引本身还在维护。

MySQL 8.0的局限也很明显:索引类型相对单一,JSON多值索引、部分索引等功能缺失。如果你的业务需要复杂的高级索引能力,MySQL可能不是最合适的。

PostgreSQL 的索引能力

PostgreSQL原生支持6种索引类型:B-tree、Hash、GiST、SP-GiST、GIN、BRIN。

  • GIN索引​:适合JSONB、数组等多值类型,以及全文检索。配合JSONB,文档型数据的查询能力远超MySQL。
  • BRIN索引​:针对非常大的表(时序数据、日志表)设计,只存储数据块的统计摘要,占用空间极小,适合物理顺序与逻辑顺序一致的大表。
  • 部分索引​:只对满足特定条件的行创建索引,比如只给status='active'的行建索引,节省空间同时提升查询效率。

国产数据库的索引能力

国产数据库按技术路线分三类:基于PostgreSQL开发、基于MySQL开发、自研分布式。

第一类:基于PostgreSQL开发(集中式为主)

这类数据库继承了PG完整的索引体系(B-tree、Hash、GiST、GIN、BRIN等),同时做了企业级增强。以金仓数据库(KingbaseES)为例:

  • 完整继承PG的6种索引类型,包括GIN、BRIN等高级索引。在KingbaseES V9版本中,内核引擎针对HNSW向量索引算法进行了深度优化,百万级向量规模下检索延迟稳定控制在毫秒级。
  • 额外做了Oracle兼容:支持位图索引、基于函数的索引的Oracle语法,降低Oracle迁移成本。金仓内置的自动化迁移工具能够自动识别并转换95%以上的Oracle语法差异。
  • 2026年金仓实现了存算分离架构,计算节点可独立横向扩展。

这类数据库的优势是:索引能力强、Oracle迁移平滑、有企业级服务支持。典型代表还有openGauss(华为)、达梦数据库等。

第二类:基于MySQL开发 + 分布式能力

这类数据库索引类型相对单一(以B-tree为主),但分布式扩展能力突出。典型代表:TiDB。TiDB 8.5版本通过分布式执行框架将索引构建吞吐量提升至550万行/秒,相比传统方式提升72倍。

第三类:自研分布式(兼顾索引丰富度)

典型代表:OceanBase。4.0版本在索引加速层内置了B+树、倒排索引、R树、HNSW向量索引等多种索引结构,单表可同时承载结构化、半结构化和非结构化数据,查询性能较传统方案提升5-8倍。

横向对比一览表

对比维度 MySQL 8.0 PostgreSQL 金仓数据库 KingbaseES OceanBase TiDB
索引类型 B-tree、Hash、FULLTEXT、空间索引 6+种 完整继承PG,兼容Oracle位图索引 多种(含HNSW、全文索引) B-tree为主
函数索引 ✅ 8.0.13+
降序索引
不可见索引 部分支持
部分索引
位图索引 有限支持 ✅(Oracle兼容)
JSON索引 虚拟列间接 GIN(强) GIN(强) 多值索引 部分支持
向量索引 扩展支持 ✅ V9(HNSW优化) ✅ 4.0+
Oracle兼容性
分布式能力 存算分离 原生分布式 原生分布式

从MySQL迁移到国产库的索引注意事项

这些坑我见过不少人踩过:

  1. 索引名长度限制​:MySQL支持64字符,PostgreSQL系(包括金仓)最长63字节,长索引名迁移时会报错。
  2. 隐式类型转换​:在PostgreSQL系的国产库中,int_col = 1.0会导致索引失效,查询中应严格匹配类型。
  3. 分布式环境索引设计​:迁移到分布式国产库后,原先的复合索引策略可能需要调整。
  4. Oracle迁移场景​:选择Oracle兼容性高的国产库(如金仓)能大幅减少索引改造工作量。

选型建议

推荐场景 推荐数据库方向 推荐理由
没有信创要求,业务简单,团队熟悉MySQL MySQL 8.0 成本低、生态成熟、索引够用
有信创要求,业务需要高级索引,原库是Oracle/PostgreSQL 基于PG开发的国产库(如金仓、openGauss) 索引能力无损继承,Oracle迁移平滑
有信创要求,数据量巨大,需要水平扩展 分布式国产库(TiDB、OceanBase) 扩展能力强,分布式事务
复杂查询、GIS、全文检索,无信创要求 PostgreSQL 索引类型丰富,优化器强大

技术选型不是比谁的功能列表更长,而是找到那个跟你的业务、团队、迁移成本最匹配的选项。再强大的索引类型,用不上也是浪费。再简单的B-tree索引,用对了也能支持亿级数据的高并发查询。

小耶在手,SQL 不愁

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

参考文献

  1. 共研产业研究院:《2026-2032年中国数据库软件行业市场供需态势及发展战略咨询报告》
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐