我需要跟踪在我网站上在线的用户,这样我才能在在线用户的头像旁边显示“在线”图标。为什么我这样做时我的MySQL查询速度很快,而当我这样做时速度很慢?
的检测,第一步是跟踪当用户最后一次露面的,所以我每次用户请求页面的时间做一个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
选择表,我以前更新ING。
当我陆续执行这些2个查询一个这些是我得到的时间:
1st query: 0.0392 seconds
2nd query: 1.5396 seconds
这会导致页面加载时间明显的延迟。
现在,当我创建了一个单独的表在线用户和第一查询改成这样:更快
1st query: 0.0411 seconds
2nd query: 0.0008 seconds
,并在页面加载:
UPDATE `online_users`
SET `last_seen` = CURRENT_TIMESTAMP
WHERE `user_id` = '$user_id'
的时代变迁到这里!
这是为什么?我的猜测是,它与表锁定有关,但我不知道足够确定或知道更多细节。
第二个查询是否仍然返回正确的结果? –
如果你运行没有第一个查询的第二个查询是否更快?这可能是某种类型的I/O问题 - 我对MySQL内部没有兴趣,但不应该是那种在SQL意义上阻塞的事情,毕竟它是在同一个事务中的同一个连接上,在这种情况下,可以看到未提交的更改或更改已经提交。你在使用InnoDB还是MyISAM? –
@Cade Roux如果我单独运行第二个查询,它会更快,但只需要0.0004分钟。我正在使用MyISAM。 – TK123