MariaDB Server 11.0 发布概述
在上一版本发布十年后,MariaDB Server 11.0 正式发布。这一版本引入了多项重要变化,其中最显著的是新的优化器成本模型,旨在更准确地预测每个查询执行计划的实际成本。此外,该版本还移除了 InnoDB 的变更缓冲区(change buffer)。
主要特性:新的优化器成本模型
MariaDB 11.0 的核心特性是新的优化器成本模型。该模型的目标是更精确地预测查询执行计划的成本,尽管在某些场景下查询可能会变慢。这一变化的主要目的是通过升级主版本号来向用户传递信号。
在 MariaDB 11.0 之前,查询优化器使用“基本成本”模型,假设一次磁盘访问的成本为 1,并基于此计算其他操作的成本。这种模型在选择最佳索引时表现良好,但在表扫描、索引扫描或范围查找时效果不佳。
成本模型的改进
MariaDB 11.0 将“存储引擎操作”的基本成本调整为 1 毫秒,这意味着大多数查询的成本应接近服务器在存储引擎、连接缓存(join_cache)和排序上的实际耗时。为了提高精确度,存储引擎的成本被细分为多个部分。默认情况下,磁盘读取成本假设为 SSD 磁盘的 400 次/秒,用户可以通过修改 OPTIMIZER_DISK_READ_COST 来调整该值。
所有存储引擎的特定成本信息都可以在 information_schema.optimizer_costs 表中查看。用户可以通过以下 SQL 查询获取默认引擎的成本:
select * from information_schema.optimizer_costs where engine="default"\G成本变量详解
以下是 MariaDB 11.0 中引入的主要成本变量及其含义:
- OPTIMIZER_DISK_READ_COST:从磁盘/SSD 读取 4K 块的时间(微秒),默认基于 400MB/秒的 SSD。
- OPTIMIZER_INDEX_BLOCK_COPY_COST:将块从全局缓存复制到本地缓存的成本。
- OPTIMIZER_KEY_COMPARE_COST:比较两个键的成本。
- OPTIMIZER_KEY_COPY_COST:将键从索引复制到本地缓冲区的成本。
- OPTIMIZER_KEY_LOOKUP_COST:在索引中查找键的成本。
- OPTIMIZER_KEY_NEXT_FIND_COST:查找索引中下一个键的成本。
- OPTIMIZER_DISK_READ_RATIO:磁盘使用成本的比率,用于计算未缓存块的成本。
- OPTIMIZER_ROW_COPY_COST:将行复制到本地缓冲区的成本。
- OPTIMIZER_ROW_LOOKUP_COST:基于行 ID 查找行的成本。
- OPTIMIZER_ROW_NEXT_FIND_COST:查找下一行的成本。
- OPTIMIZER_ROWID_COMPARE_COST:比较两个行 ID 的成本。
- OPTIMIZER_ROWID_COPY_COST:从索引复制行 ID 的成本。
其他优化器改进
- 磁盘访问假设:在计算磁盘访问成本时,假设所有行和索引数据在查询期间都被缓存。
- 排序成本优化:排序(filesort)的成本计算更加准确,使优化器能够更好地在索引扫描和文件排序之间进行选择。
适用场景
新的优化器成本模型在以下场景中通常表现更好:
- 涉及两个以上表的查询。
- 索引中包含大量相同值的情况。
- 范围查询覆盖超过 10% 的表数据时。
- 复杂查询中未对所有使用的列进行索引时。
- 混合使用不同存储引擎的查询(如同时使用 InnoDB 和 Memory 表)。
- 需要使用
FORCE INDEX才能获得良好执行计划的情况。 - 使用
ANALYZE TABLE后执行计划变差或不够理想时。 - 包含大量派生表(子查询)的查询。
- 可以通过索引解决的 ORDER BY / GROUP BY 查询。
升级指南
MariaDB 提供了详细的升级指南,包括如何在不同主版本之间升级,以及从 MariaDB 10.11 升级到 11.0 的具体步骤。更多信息可参考官方文档。
总结
MariaDB Server 11.0 通过引入新的优化器成本模型,显著提高了查询执行计划的成本预测准确性。尽管在某些场景下查询性能可能有所下降,但整体上该版本为复杂查询和混合存储引擎的使用场景提供了更好的支持。用户可以通过调整成本变量来进一步优化查询性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。