我有一个大容量的 MariaDB 10 服务器数千个数据库,其中包含超过一百万个表。目前我们只达到了大约 20% 的查询缓存命中率。我们已经在使用 Memcache 和其他缓存层。是否有关于何时禁用查询缓存以获得更好性能的经验法则?
你有 4 个或更多内核/处理器的机器吗?当前的 MySQL 查询缓存实现不能很好地扩展,并且在具有更多线程的系统上存在互斥争用问题(如果相关数据已经在其他数据库中,则查询可能花费更多的时间来等待检查查询缓存,而不是需要重新执行)允许并行访问的缓冲区)。
你有可缓存的查询吗?如果大多数查询不重复(它们包含一些随机或时间相关的常量等 - 想象一个查询以 1 秒的精度获取“活动文章” - 如果多次触发,此类查询将被缓存并可能返回一秒钟,但下一秒,一个新版本会用不同的时间戳查询,因此它不匹配并重新执行 - 你的 QC 充满了这些查询,每个只有效 1 秒)。然后是那些包含 rand()、now() 和类似函数的函数,它们根本无法缓存。
事务可能与 QC发生冲突- 当事务中的一个查询使查询缓存中的某个表无效时,稍后在同一事务中对该表的选择根本无法使用查询缓存(因为可重复读取一致性 - 其他事务可能会填充 QC从这个交易的角度来看,数据将是陈旧的)。
数以千计的数据库和数以百万计的表听起来像是某种托管 - 您可能无法修复查询或保证它们完全可以缓存?似乎只有很小的百分比,给它更多的内存只会减慢失效速度,对命中率没有帮助。
| 归档时间: |
|
| 查看次数: |
3331 次 |
| 最近记录: |