VIDEX 为 MySQL 提供了一个解耦的、可扩展的开源虚拟索引引擎 ([VI]rtual in[DEX])。
- 虚拟索引:不需要真实数据、仅基于统计信息和算法模型,即可高精度地模拟 MySQL 产生的查询计划、模拟表连接顺序、模拟索引选择;
- 分离式架构 (Disaggregated):VIDEX 支持在单独的实例上部署,而不必须在原始库 MySQL 上安装;VIDEX 支持独立启动算法服务,而不必嵌入 MySQL 中;
- 可拓展 (Extensible):VIDEX提供了便捷的接口,用户可以将 基数估计(Cardinality)、独立值估计(NDV) 等算法模型应用于 MySQL 的下游任务中(例如索引推荐);
“虚拟索引” 旨在模拟 SQL 查询计划中使用索引的代价(cost), 从而向用户展示索引对 SQL 计划的影响,而无需在原始实例上创建实际索引。 这项技术广泛应用于各种 SQL 优化任务,包括索引推荐和表连接顺序优化。 业界许多数据库已经以官方或第三方的方式提供了虚拟索引功能, 例如 Postgres、 Oracle 和 IBM DB2。
注意:此处使用的“虚拟索引”一词与 MySQL 官方文档 中提及的“虚拟索引”不同, 后者指的是在虚拟生成列上构建的索引。
此外,VIDEX 封装了一组用于成本估算的标准化接口, 解决了学术研究中的热门话题,如 基数估计 和 不同值数量(NDV)估计。 研究人员和数据库开发人员可以轻松地将自定义算法集成到 VIDEX 中以用于优化任务。 默认情况下,VIDEX 可以以 ANALYZE TABLE
的方式收集统计信息,或者基于少量采样数据构建统计信息。
VIDEX 提供两种启动模式:
- 作为插件安装到生产数据库:将 VIDEX 作为插件安装到生产数据库实例。
- 独立实例:此模式可以完全避免影响在线运行实例的稳定性,在工业环境中很实用。
在功能方面,VIDEX 支持创建和删除索引(单列索引、复合索引、EXTENDED_KEYS 索引)。 目前暂不支持函数索引(functional indexes
)、全文索引(FULL-Text
)和空间索引(Spatial Indexes
)。
在拟合精度方面,已经在 TPC-H
、TPC-H-Skew
和 JOB
等复杂分析基准测试上对 VIDEX 进行了测试。 给定准确的 ndv 和 cardinality 信息,VIDEX 可以 100% 模拟 MySQL InnoDB 的查询计划。 (更多详细信息参考 3. Example: TPCH Tiny 章节)。
架构
VIDEX 包含两个模块:
- VIDEX-Optimizer-Plugin(简称 VIDEX-Optimizer):VIDEX 的 “前端”。可以作为插件安装到现有数据库,或者以一个独立的新实例启动。这一部分实现了 MySQL 查询优化器接口,并将其中一部分复杂的请求转发到 VIDEX-Statistic-Server。我们全面梳理了 MySQL handler 的超过 90 个接口函数,并实现与索引(Index)相关的接口。
- VIDEX-Statistic-Server(简称 VIDEX-Statistic):VIDEX 的 “后端”。基于收集到的统计信息(表行数、表大小、直方图等等)和集成的算法或模型,计算独立值(NDV) 和基数(Cardinality),并将结果返回给 VIDEX-Optimizer。
评论