我即将开展一个项目,其中一项要求是缓存本质上只读的数据,以减轻数据库的压力。我只是对数据库的缓存工作原理有点困惑。
如何做缓存有用吗?我见过一种叫做查询缓存的东西,但是它缓存查询结果?还是只是查询?而且视图不也是一种缓存形式吗?
我只是在寻找正确的方向。该项目将使用 MySQL 5.1 作为存储,因此任何可以消除我的困惑的链接都会有很大帮助。常规的 Google 搜索只为我提供了查询缓存,由于我在这方面缺乏知识,我不确定这是否是我应该走的方向。
答案1
MySQL 查询缓存确实会缓存查询结果,只要后续查询完全相同,就会提供计算结果,而不是实际运行查询。MySQL 还将跳过计算执行计划。
要使用它,您可以开启它在您的服务器中my.cnf
或使用SQL缓存提示在您的查询前面。如果您在 my.cnf 中将其打开,则可以通过在查询前面使用 SQL_NO_CACHE 来告诉 MySQL 不要缓存结果。
对表的任何写入(INSERT、UPDATE、DELETE 等)都将使来自该表的查询缓存中的所有条目无效。
查询缓存的一个性能异常是:它使用低效的算法在缓存中查找条目,因此创建更大的缓存可能会导致性能下降。您应该尝试使用自己的数据和查询配置文件来更改它,但上次我做这个实验时发现 256MB 左右是最佳点。大于或小于这个值,性能就会变差。手册建议“几十兆“
你也可以使用类似以下方法在 MySQL 之外实现缓存memcached。这对应用程序来说并不透明,因此您必须在应用程序中添加额外的代码来处理对 memcached 的查找,然后,如果未找到,则在数据库中进行查找并将结果存储在 memcached 中。
答案2
你可以用几种方法来实现这一点。可能还有其他方法,但我马上想到了这两种方法。
您可以创建另一个表来保存缓存的结果,并按计划运行可能连接多个表的昂贵查询很多记录并将记录转储到此表中。SELECT *
从单个表执行查询应该比执行 SELECT 查询(连接 12 个不同的表,每个表包含数百万条记录)更便宜。虽然这并没有完全消除数据库服务器的工作量,但它应该通过仅按计划执行昂贵的查询并让您的常规客户端从缓存表中获取数据来减少计算工作量。
或者,对于完全独立于数据库的缓存,你可以实现类似Redis。这会将数据存储在内存中,并且速度应该非常快,但需要应用程序中的一些额外逻辑来将其用作数据源而不是实际数据库。它的扩展性也很好 - Stack Exchange 网络在其网站上非常有效地利用了它。