查询缓存与分区

其他人一样,我们对 MySQL 中修复一个导致查询缓存分区无法可靠协同工作的bug并不满意。简单来说,这个 bug 就是如果启用了查询缓存并使用了分区表,并且分区表使用的是事务性引擎(如 InnoDB 或 XtraDB),那么查询缓存可能在某些情况下返回不正确的结果。

返回不正确的结果绝对是一个高优先级的 bug。然而,上游的修复方案是禁用所有来自分区表的查询缓存。我们想要一个更好的解决方案,因为查询缓存对分区表来说非常有用和有益,就像它对非分区表一样有用和有益。

问题的根源在于查询缓存对分区表没有任何可见性。特别是它不了解给定表的存储引擎,包括表是否是事务性的。这种信息缺失导致查询缓存无法智能地缓存和返回查询的缓存结果。

我们通过创建一种方式来解决这个问题,让查询缓存能够与分区表的底层存储引擎通信,以查看是否可以

  1. 缓存查询结果
  2. 返回缓存结果

掌握了这些信息后,查询缓存现在可以正确地缓存新查询,并每次为重复查询提供正确的缓存结果,无论表是否分区,也无论表是否事务性。

该补丁已经包含在 Launchpad 上的 MariaDB 5.5 源码中,并将包含在我们的下一个 MariaDB 5.5 版本中。

更新:Monty 也在他的博客上写到了这件事。

MariaDB Foundation 发布

Daniel Bartholomew 是 MariaDB 的发布经理。他写了两本与 MariaDB 相关的书:《Getting Started with MariaDB》(现已出第二版)和《MariaDB Cookbook》,均由 Packt 出版。