查询缓存与分区
像其他人一样,我们对 MySQL 中修复一个导致查询缓存和分区无法可靠协同工作的bug并不满意。简单来说,这个 bug 就是如果启用了查询缓存并使用了分区表,并且分区表使用的是事务性引擎(如 InnoDB 或 XtraDB),那么查询缓存可能在某些情况下返回不正确的结果。
返回不正确的结果绝对是一个高优先级的 bug。然而,上游的修复方案是禁用所有来自分区表的查询缓存。我们想要一个更好的解决方案,因为查询缓存对分区表来说非常有用和有益,就像它对非分区表一样有用和有益。
问题的根源在于查询缓存对分区表没有任何可见性。特别是它不了解给定表的存储引擎,包括表是否是事务性的。这种信息缺失导致查询缓存无法智能地缓存和返回查询的缓存结果。
我们通过创建一种方式来解决这个问题,让查询缓存能够与分区表的底层存储引擎通信,以查看是否可以
- 缓存查询结果
- 返回缓存结果
掌握了这些信息后,查询缓存现在可以正确地缓存新查询,并每次为重复查询提供正确的缓存结果,无论表是否分区,也无论表是否事务性。
该补丁已经包含在 Launchpad 上的 MariaDB 5.5 源码中,并将包含在我们的下一个 MariaDB 5.5 版本中。
更新:Monty 也在他的博客上写到了这件事。
只是告诉我,为什么 MySQL 不这样做?这很难吗?很费时吗?或者也许是 Oracle 的问题?
我不知道。我们的补丁(像 MariaDB 中的其他一切一样)是根据 GPL v2 许可的。所以他们可以自由地获取并将其合并到他们的社区版中。
Daniel,
干得好,我们期待测试并使用它。查询缓存对于报告服务器尤其有意义,报告服务器更有可能拥有分区表。
谢谢!
-ivan
不要感谢我,我只是个信使。 🙂
Sanja Byelkin 是创建这个补丁的开发者。我很高兴你喜欢它!
你好 Daniel。
我知道这篇文章很旧了,但我看了看 https://mariadb.com/kb/en/mariadb/query-cache/#queries-stored-in-the-query-cache,里面说“如果一个查询满足以下条件,它也不会被添加到缓存中:…… 它访问了分区表(>=MariaDB/MySQL 5.5.23)”。
我认为这与这篇文章相矛盾,所以我想知道对分区表的查询是否会使用查询缓存。
非常感谢!
谢谢 Leandro,那篇文档页面似乎不正确——它已经被修复了。