Я занимаюсь этим уже несколько дней, пытаясь различными способами снизить нагрузку на процессор на 95-135% из-за недавнего сценария AJAX, вызывающего этот запрос:
SELECT COUNT(*) as total FROM users WHERE last_access >= DATE_SUB(NOW(), INTERVAL 1 MINUTE) ORDER BY last_access DESC LIMIT 16
И я попытался COUNT(id)
сократить время сканирования таблицы, я добавил LIMIT
и ORDER BY
, я думаю, что это улучшилось, но я не могу сказать. Я отслеживаю top -P на моем BSD-боксе, и процессор довольно быстро зашкаливает, почти убивая apache, хотя полагаюсь на это при тестировании запросов.
У нас есть Бит jquery, который запрашивает скрипт AJAX и возвращает количество таблиц в соответствии с последними пользователями в сети с 15-секундным интервалом на стороне jquery (1 минута в операторе запроса). Это было хорошо в течение дня, затем заметил, что сервер работал сверхурочно, и фанаты отказались от работы.
В итоге мы удалили MySQL 5.7 и установили MariaDB 12.4 - и это имело огромное значение, однако, когда он работал при сниженной нагрузке на ~ 20% ЦП, он тоже боролся .. так что запрос плохой. Я отключил скрипт и, конечно же, процессор снизился до 15-30% avg, однако это большая часть UX нашего сайта. Это просто сообщает (455 онлайн), например, и обновляет текст каждые 15 секунд (динамически).
Мой вопрос ... из-за 15-секундного интервала совпадений с оператором SELECT(*)
в таблице 9600 записей , как я могу оптимизировать это, чтобы сервер SQL не обрабатывал sh и не высасывал всю доступную память?
Я не включил скрипт, так как он прекрасно работает запрос является проблемой, но предоставит при необходимости.
Это наш единственный AJAX скрипт на сайте. Другие AJAX звонки не совершаются.
С уважением,