Почему мой запрос MySQL быстрый, когда я делаю это таким образом, и медленный, когда я делаю это таким образом? - PullRequest
5 голосов
/ 20 января 2012

Мне нужно отслеживать пользователей, которые находятся в сети на моем сайте, чтобы я мог отобразить значок «онлайн» рядом с аватарами пользователей, которые находятся в сети.

Первый шаг обнаружения этого - сохранитьотслеживать, когда пользователя в последний раз видели, поэтому я выполняю запрос 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

и страница загружается намного быстрее!

Почему это?Я предполагаю, что это как-то связано с блокировкой таблицы, но я не знаю достаточно, чтобы быть уверенным или знать больше деталей.

Ответы [ 3 ]

1 голос
/ 20 января 2012

Поскольку SELECT * включает last_seen MySQL не может кэшировать запрос или подзапросы.Вы можете попробовать явное перечисление всех полей, но last_seen.

(но отдельная таблица online_users имеет большой смысл.)

0 голосов
/ 20 января 2012

Предполагая, что запрос SELECT выполняется несколько раз перед вашим тестом, вы, вероятно, видите влияние кеша запросов.Любое обновление таблицы приведет к аннулированию кэша и выполнению запроса снова.Обновляя другую таблицу, вы избегаете забивать эти записи в кеш.

0 голосов
/ 20 января 2012

запрос к таблице innoDB медленнее, чем к MyISAM.больше строк в таблице делают запрос более медленным.неправильная индексация таблицы замедляет запрос, проверьте с помощью команды EXPLAIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...