我需要跟踪在我的网站上在线的用户,以便我可以在在线用户的头像旁边显示一个“在线”图标。
检测这一点的第一步是跟踪用户上次被看到的时间,因此每次用户请求页面时我都会执行 UPDATE 查询:
UPDATE `users`
SET `last_seen` = CURRENT_TIMESTAMP
WHERE `user_id` = '$user_id'
现在,在此之后,我执行另一个查询,这个查询在特定条件下获取我网站的所有用户,以便我可以在主页上显示它们:
SELECT *,
(ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) AS SearchRadius
FROM `users`
INNER JOIN `profiles` ON (
users.user_id = profiles.user_id
)
WHERE (users.latitude > 38.904216788163 AND users.latitude < 42.501503211837)
AND (users.longitude > -76.252301637251 AND users.longitude < -71.507178362749)
AND (ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) < 200 AND users.sex = '1' AND users.seeking = '2' AND users.user_id != '1' AND users.account_status = '1' LIMIT 0, 10
别介意这个查询的疯狂程度,基本上重点是我从我之前更新的同一个
users
表中选择。当我一个接一个地执行这两个查询时,这些是我得到的时间:
1st query: 0.0392 seconds
2nd query: 1.5396 seconds
这会导致页面加载时间明显延迟。
现在,当我为在线用户创建一个单独的表并将第一个查询更改为:
UPDATE `online_users`
SET `last_seen` = CURRENT_TIMESTAMP
WHERE `user_id` = '$user_id'
时代变成了这样:
1st query: 0.0411 seconds
2nd query: 0.0008 seconds
并且页面加载速度更快!
为什么是这样?我的猜测是它与表锁定有关,但我不知道足够确定或了解更多细节。
最佳答案
因为 SELECT *
包含 last_seen
MySQL 不能缓存查询或子查询。您可以尝试显式枚举除 last_seen
之外的所有字段。
(但是单独的表 online_users
很有意义。)