为什么要使用MySQL DB缓存?

max*_*ax_ 4 php mysql database 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
Run Code Online (Sandbox Code Playgroud)

基于位置:

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 ?,?
Run Code Online (Sandbox Code Playgroud)

这些查询显然需要时间.特别是后者由于其引起的性能强度.

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

  • Memcachd
  • Redis的
  • 和更多.

我的问题是,在查询方面,何时应该使用缓存,以及使用缓存有什么好处?

谢谢,

麦克斯!

Mar*_*els 5

当缓存比从头开始生成结果更便宜时,您应该缓存.

这笔费用取决于:

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

但总是从源头开始.您是否检查了MySQL的慢查询日志,以查看哪些查询成本高昂?它可以帮助您查看缺少重要索引的位置以及哪些查询意外地长时间查看.[pt-query-digest]1从Percona的-工具包可以通过总结此日志文件与帮助.在开始缓存之前优化数据库.

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

缓存的选择当然是重要的.我假设你已经在使用MySQL的内置查询缓存了吗?确保它已启用并且已分配足够的内存.像'SELECT username'这样的简单查询无论如何都很便宜,但也很容易被MySQL本身缓存.虽然内置查询缓存有很多限制,但很多原因都是查询未缓存或缓存被刷新.例如,简单地跳过具有函数的查询(例如基于位置的查询).阅读文档.

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

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

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

另一个提示:衡量一切.如果您知道什么需要时间,您只知道要优化或缓存的内容.此外,只有再次测量时,优化的结果才会明确.实现statsd之类的东西,并测量应用程序中的各种事件和时间.比不够好太多了.绘制结果图并随时间进行分析.出现了什么,你会感到惊讶.