【问题标题】:Queriable Cache for MySQLMySQL 的可查询缓存
【发布时间】:2016-09-14 00:53:29
【问题描述】:

我有一个要求,我必须为 MySQL 数据库创建一个缓存层。数据库很大,有大约 100 个表和数百万行。几乎所有的表都有外键关系。 例如:

表格:规则

CREATE TABLE `rule` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `code` varchar(256) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_rule_code` (`code`)
)

表格:参数

CREATE TABLE `params` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `rule_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `rule_id` (`rule_id`),
  CONSTRAINT `params_ibfk_1` FOREIGN KEY (`rule_id`) REFERENCES `rule` (`id`)
) 

我可以用一个键存储规则表的行,类似地 参数表分开。现在我想使用某种 where 条件从两个表中获取行,类似于:

Select * from rule r, params p where r.id = p.rule_id and r.id = (some_value);
  1. 有没有办法可以缓存数据并对其执行连接?(基本上是在缓存上运行上述查询)

  2. 为此我应该使用什么缓存? Aerospike、Redis、MongoDB 等,

  3. 您能否给出我的包装类的基本概念,它为此实现执行上述操作(1)

【问题讨论】:

  • MySQL 有一个内置的缓存,所以也许从尝试调整它开始会更合理? percona.com/blog/2015/01/02/…dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html
  • @MichałSznurawa 问题是要获取的数据很大(大约 30 Mb)并且正在使用的表更新非常频繁(大约 3 更新/秒),因此使用内置无法缓存
  • 你能写更多关于如何使用数据的内容吗?多久阅读一次?是否需要始终获得最新的副本?
  • @MichałSznurawa 始终需要新鲜副本。读取是动态的,目前平均每 3 秒读取 1 次。数据是根据前端传过来的参数获取的,是动态的
  • 因此,您似乎不会利用标准缓存本身的任何优势。当您在 3 秒后尝试再次读取缓存中的数据时(根据您所写的内容),缓存中的数据很可能无效。如果您在所描述的情况下遇到 MySQL 性能问题,那么我会说您应该寻找非规范化并将数据保持在由您的读取确定的结构中(以避免连接)。寻找以价格提供廉价写入和读取的存储,例如您可以对数据执行的一致性或有限的操作集。

标签: java mysql performance caching nosql


【解决方案1】:

您是否证明存在问题?根据你所说的,你有任何性能问题大约是 30 倍。您可以(可能)每秒执行 100 次更新,而不仅仅是 3 次,同时每秒执行数百次(而不是 0.33 次)读取。

您确实需要将innodb_buffer_pool_size 设置为可用 ram 的大约70%。

鉴于提供的索引,您提供的查询(带有JOIN)应该没有问题。

如果你有性能问题,你在这里没有展示任何证据。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2015-02-05
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多