【发布时间】:2013-08-20 20:41:04
【问题描述】:
在我的应用程序中,我尝试在尽可能少的查询中获取我需要的所有数据。这通常会导致具有许多连接的大型查询。这限制了您可以使用 Memcache 或 Redis 等软件缓存的内容(据我所知)。对于大型查询,您不知道哪些部分可能已被缓存。似乎您必须以较小的部分查询所有内容,以便可以单独缓存这些小部分。这个想法是您只需要执行几十个小查询即可填充缓存,并且大多数情况下您将访问缓存而不是查询。这就是高流量 PHP/MySQL 网站的处理方式吗?即使您有包含许多连接的大型查询,是否有一种有效缓存的好方法?
例子:
SELECT user.name, user.birthday
FROM follower
INNER JOIN user ON (user.id = follower.user)
WHERE follower.following = '1'
此查询的结果包括关注用户 1 的任何用户的姓名和生日。此查询的结果可以被缓存,但这仅在获取用户 1 的关注者时才有用。
替代方案:
SELECT follower.user
FROM follower
WHERE follower.following = '1'
对于每个结果,使用 ?由上一个查询中的 follower.user 填充:
SELECT name, birthday FROM user where user.id = ?
在这种情况下,我们可以在从 MySQL 查询之前检查用户 ? 的姓名和生日是否被缓存。如果它们没有被缓存,或者有些被缓存而有些没有,那么抓取丢失的并缓存它们。您还可以缓存关注者 ID 列表,然后下次不需要运行任何查询。不同之处在于,用户的姓名和生日将对最终需要在任何其他上下文中了解这些关注者的任何其他用户有用。
我是否在缓存较大查询时遗漏了什么?还是第二种方式是正确的方式?
【问题讨论】:
-
“这通常会导致带有很多连接的大型查询”,也意味着很多结果行?
-
我相信 PHP 有某种 prepare_query 函数,它可以对查询做一些工作,然后你所要做的就是设置参数来运行它。这些准备好的语句可以使大量查询的执行速度更快,因为数据库引擎不必在它们之前进行所有准备工作。