4

我目前正在开发两个严重依赖 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 ?,?

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

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

  • 内存缓存
  • 雷迪斯
  • 和更多。

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

谢谢,

最大限度!

4

2 回答 2

5

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

此成本取决于以下因素:

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

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

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

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

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

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

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

另一个提示:测量一切。只有知道什么需要时间,您才知道要优化或缓存什么。此外,您的优化结果只有在您再次测量时才会清楚。实现类似statsd的东西并测量应用程序中的各种事件和时间。太多总比不够好。绘制结果并随着时间的推移对其进行分析。你会惊讶于发生了什么。

于 2012-07-28T02:04:34.347 回答
0

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

于 2012-07-28T02:10:42.800 回答