在我的应用程序中,我尝试在尽可能少的查询中获取我需要的所有数据。这通常会导致具有许多连接的大型查询。这限制了您可以使用 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 列表,然后下次不需要运行任何查询。不同之处在于,用户的姓名和生日将对任何其他最终需要在任何其他上下文中了解这些关注者的信息的用户有用。
我在缓存更大的查询时遗漏了一些东西吗?还是第二种方式是正确的方式?