Мне нужно отслеживать пользователей, которые находятся в сети на моем сайте, чтобы я мог отобразить значок «онлайн» рядом с аватарами пользователей, которые находятся в сети.
Первый шаг обнаружения этого - сохранитьотслеживать, когда пользователя в последний раз видели, поэтому я выполняю запрос 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
, которую я ранее обновлял.
Когда я выполняю эти 2 запроса один за другим, вот время, которое я получаю:
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
и страница загружается намного быстрее!
Почему это?Я предполагаю, что это как-то связано с блокировкой таблицы, но я не знаю достаточно, чтобы быть уверенным или знать больше деталей.