为什么使用MySQL数据库缓存


Why use MySQL DB Caching?

我目前正在开发两个严重依赖MySQL数据库的iOS应用程序。它们都有自己的API,由各自的应用程序请求,该应用程序运行相关查询,从MySQL数据库请求数据。

查询不同于简单的、基于用户的或基于"对象"的:

SELECT `username`, `id`, `full_name` FROM `users` WHERE `id` = 1
INSERT INTO `users` (`full_name`, `username`, `email`, `password`, `signup_method`, `latitude`, `longitude`) VALUES (?, ?, ?, ?, ?, ?, ?)"
SELECT q.*, (SELECT COUNT(a.qid) FROM answers as a WHERE qid=q.id) AS a_count FROM questions as q ORDER BY a_count DESC LIMIT 1, 10

基于位置:

SELECT ( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance FROM `users` HAVING distance <= 5 ORDER BY points DESC
SELECT * , (6371 * acos(cos(radians(latitude)) * cos(radians({$values['latitude']})) * cos(radians({$values['longitude']}) - radians(longitude)) + sin(radians(latitude)) * sin(radians({$values['latitude']})))) AS distance FROM `questions` HAVING distance <= ? ORDER by distance LIMIT ?,?

这些查询显然需要时间。尤其是后者,因为它带来了性能强度。

许多服务在数据库旁边使用缓存层来提高性能。例如:

  • Memcachd
  • Redis
  • 等等

我的问题是,对于查询,应该在什么时候使用缓存,使用缓存的好处是什么?

谢谢,

麦克斯!

当缓存比从头开始生成结果更便宜时,应该简单地进行缓存。

此成本取决于以下内容:

  • 各种服务器和软件的处理能力。也许您的数据库服务器的容量有限,但另一台服务器的容量过剩
  • 钱:购买更强大的硬件比构建缓存系统更便宜吗
  • 从头开始生成结果的CPU成本与缓存的RAM成本。大多数情况下,DB服务器是CPU绑定的,而缓存服务器是内存绑定的。您可以自行决定升级哪个更便宜
  • 从缓存检索的速度与从数据库检索的速度。如果如您所说,查询时间昂贵,而从缓存中获取查询更便宜,那么缓存将加快您的请求
  • 缓存项目需要刷新的频率。如果它们只持续几秒钟,可能就不值得这么麻烦了
  • 具有过期和刷新缓存项的方法。这通常是一个非常棘手的问题
  • 拥有管理额外复杂性的技术知识和时间

但始终要从源头入手。你有没有检查过MySQL的慢速查询日志,看看哪些查询成本很高?它可以帮助您查看丢失重要索引的位置,以及哪些查询花费的时间出乎意料地长。Percona Toolkit中的[pt-query-digest] 1可以通过总结此日志文件来提供帮助。在开始缓存之前优化数据库。

看看你的查询类型,在我看来,缓存结果甚至预热缓存都是值得的

缓存的选择当然是一个重要的选择。我想你已经在使用MySQL的内置查询缓存了吧?确保它已启用,并且有足够的内存分配给它。像"SELECT username"这样的简单查询无论如何都很便宜,但MySQL本身也很容易缓存。不过,内置查询缓存有很多限制,还有很多原因导致查询没有缓存或缓存被刷新。例如,带有函数的查询(如基于位置的查询)会被跳过。阅读文档。

使用Redis这样的缓存可以更好地控制缓存内容、缓存时间和过期时间。关于如何实现这一点,有很多想法,它们也取决于您的应用程序。看看网周围。

我建议启用查询缓存,因为它既简单又便宜,而且会有所帮助,而且我肯定会考虑为数据库实现内存缓存层。也许像Solr这样的索引服务器值得考虑,它内置了基于位置的查询方法。我们将其与MySQL一起使用。

Memcached和Redis是很好的缓存选择。我个人会选择Redis,因为它有更多的用例和可选的磁盘持久性,但这完全取决于你。也许您选择的框架有一些现有组件,可以在应用程序中使用。

另一个提示:测量所有东西。只有当你知道什么需要时间时,你才知道要优化或缓存什么。此外,只有当您再次测量时,优化的结果才会清楚。实现类似statsd的东西,并测量应用程序中的各种事件和时间。过犹不及。将结果绘制成图表,并随着时间的推移进行分析。你会对结果感到惊讶的。

缓存使您能够比只使用MySQL查询更快地访问数据库,因为它们非常耗时。在大多数情况下,当web应用程序变得很大时,数据库将成为其最大的瓶颈,由于查询速度的原因,会导致大量备份。因此,许多网站和公司都将缓存作为一种快速而简单的方式来提高从数据库访问信息的速度。我想说的是,在开发的早期阶段不要担心,相反,当你有一个可用的alpha网站时,可以尝试一下。