Hotdry.

Article

VillageSQL:为 MySQL 注入可扩展性的新思路

VillageSQL 通过 VEF 扩展框架为 MySQL 带来自定义类型、函数和热加载能力,分析其架构设计与 Roaring Bitmap 扩展实战。

2026-05-26systems

MySQL 的扩展性一直是开发者社区长期诟病的痛点。相比于 PostgreSQL 丰富的扩展生态,MySQL 的插件接口虽然存在,却难以支撑自定义数据类型等深层需求。VillageSQL 的出现试图打破这一僵局 —— 作为 MySQL 8.4 的跟踪分支,它引入了 VillageSQL Extension Framework(VEF),在保持完全兼容的前提下,为 MySQL 带来了真正意义上的扩展能力。

MySQL 扩展的历史困境

传统 MySQL 提供了插件(Plugin)和组件(Component)两种扩展机制。插件接口允许开发者添加存储引擎、全文解析器等,但无法定义新的列类型;组件系统则在 8.0 版本引入,提供了更现代化的生命周期管理,却依然受限于预设的接口边界。这种设计上的保守使得许多领域特定需求 —— 比如图数据库的边遍历、向量检索的近似计算 —— 难以在 MySQL 内部实现,迫使开发者转向外部服务或异构架构。

VillageSQL 的核心洞察在于:扩展框架应当允许开发者定义 "一等公民" 的数据类型和函数,而非仅仅在现有类型上包装 UDF(用户定义函数)。这意味着新的数据类型可以像原生 INTVARCHAR 一样参与索引、查询优化和存储引擎交互。

VEF 架构设计解析

VEF 扩展采用 .veb(VillageSQL Extension Bundle)格式打包,通过 INSTALL EXTENSION 命令加载。与需要重启服务器的传统插件不同,VEF 支持运行时热加载和卸载 ——UNINSTALL EXTENSION 后即可重新安装新版本,这对开发迭代至关重要。

扩展开发基于 C++,VillageSQL 提供了模板仓库(vsql-extension-template)和 Protocol 2 SDK。一个典型的扩展需要实现三类核心接口:

自定义类型定义:声明新的 SQL 类型及其序列化 / 反序列化逻辑。与 PostgreSQL 的 CREATE TYPE 不同,VEF 类型在底层以二进制形式存储,需要开发者处理与字符串表示的转换。

类型方法:为自定义类型实现成员函数,如 from_stringto_string。值得注意的是,VEF 不支持标准 SQL 的 CAST(expr AS type) 语法,必须使用双冒号调用 TYPE::from_string('{...}')

独立函数:实现接受自定义类型作为参数的 SQL 函数,支持集合运算、数学计算等操作。

版本管理内置于扩展清单(manifest),服务器在加载时强制执行版本兼容性检查,避免了传统插件常见的版本错配问题。

实战:Roaring Bitmap 扩展开发

Max De Marzi 的 Roaring Bitmap 扩展是 VEF 能力的典型展示。Roaring Bitmap 是一种压缩位图数据结构,在高基数集合运算场景(如用户标签筛选、好友关系分析)中性能远超传统 BLOB 存储。

开发过程中暴露了几个关键工程细节。首先是变长类型的处理:Roaring Bitmap 的序列化长度取决于数据分布,非常量。在实现 roaring64_to_string 函数时,必须在返回前调用 out.set_length() 显式设置输出缓冲区长度,否则服务器会报错 field_length != persisted_length

其次是与存储过程的集成。早期版本在存储过程调用自定义类型时存在问题,需要框架层面的修复。这揭示了扩展框架与 MySQL 核心深度耦合的现实 —— 即使是 "热加载" 的扩展,其类型系统仍需与服务器内部的字段元数据、权限检查等子系统协调。

开发流程遵循模板化路径:克隆模板仓库 → 实现类型和方法 → 使用 CMake 构建(需开启 -DVillageSQL_USE_DEV_HEADERS=ON 以使用 Protocol 2 头文件)→ 复制 .veb 文件到服务器目录 → 执行 INSTALL EXTENSION。官方提供的 local-ci.sh 脚本支持在真实实例上运行 mysql-test,确保扩展的行为符合预期。

当前局限与未来展望

尽管 VEF 已经展现出潜力,当前版本仍存在明显边界。存储层访问尚未开放 —— 扩展无法直接与索引结构或表数据交互,这意味着无法基于自定义类型实现专门的查询优化器或存储引擎集成。De Marzi 在文章中提到,一旦存储层 API 开放,将能够实现基于 Roaring Bitmap 的图遍历查询计划,复现 Neo4j 中的高效 k-hop 邻居计算。

另一个现实考量是项目成熟度。VillageSQL 目前处于早期 alpha 阶段,官方文档明确建议用于实验而非生产。扩展生态尚在萌芽,已有的参考实现包括 UUID、网络地址、加密函数、多维几何和 AI 提示函数等,但距离 PostgreSQL 的扩展丰富度仍有差距。

路线图显示向量索引是下一个重点方向 —— 这与 AI 时代的需求高度契合。如果 VillageSQL 能够在保持 MySQL 兼容的同时,提供类似 pgvector 的向量检索能力,将为大量现有 MySQL 用户提供平滑的 AI 应用升级路径。

评估与落地建议

对于考虑采用 VillageSQL 的团队,建议采取以下策略:

非关键场景先行:在分析型工作负载、缓存层或内部工具中试点,积累扩展开发经验,等待生产级稳定性验证。

关注类型设计:自定义类型的二进制序列化格式将成为长期承诺,变更成本高昂。设计时需考虑向前兼容性,预留版本字段或扩展位。

跟踪存储层 API:存储层访问是 VEF 的终极能力,一旦开放将彻底改变 MySQL 的扩展范式。建议关注 GitHub 仓库的 issue 和 PR 动态。

评估云部署限制:De Marzi 提到 Neo4j 的云托管版本曾禁止用户扩展,VillageSQL 的云策略尚待观察。如有云端部署需求,需提前确认扩展加载权限。

VillageSQL 的价值不仅在于技术实现,更在于它为 MySQL 生态注入了久违的创新活力。在 PostgreSQL 持续蚕食市场份额的背景下,这种 "兼容 + 扩展" 的渐进式革新或许是 MySQL 保持竞争力的可行路径。对于开发者而言,VEF 提供的扩展能力意味着可以在不迁移数据的前提下,为 MySQL 注入领域特定的查询能力 —— 这种灵活性本身就值得持续关注。


参考来源

  • Max De Marzi, "Extending MySQL with VillageSQL", 2026-05-21
  • VillageSQL Documentation, "Extensions or Plugins and Components"

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com