У меня есть программа, которая сканирует пользователей, которые находятся в сети на сервере, и для каждого найденного пользователя вставляет новую строку в таблицу. Это сканирование происходит один раз каждые 5 минут, а данные используются для рисования графика активности пользователя на веб-сайте.Нужна помощь Ускорение этого запроса
Вот структура моего стола:
-------------------------------------------------------
| stats_table |
-------------------------------------------------------
| id, bigint(20) unsigned not null PRI auto_increment |
| scan_id, bigint(20) unsigned not null |
| username, varchar(32) null |
| time_scanned, timestamp not null def=curr_timestamp |
-------------------------------------------------------
Я хочу, чтобы получить количество пользователей агрегат найден начиная с полуночи, для каждого сканирования.
мне удалось получить это, но запрос занимает более 15 секунд, чтобы закончить:
SELECT COUNT(*) FROM (SELECT DISTINCT t.scan_id, t1.username FROM
stats_table INNER JOIN stats_table t1 ON
t.scan_id >= t1.scan_id WHERE
t1.time_scanned > CONCAT(DATE(t.time_scanned), ' 00:00:00') AND
t1.time_scanned > DATE_SUB(NOW(), INTERVAL 24 HOUR) AND
t1.time_scanned <= NOW()
) s GROUP BY s.scan_id
так что мне интересно, если есть более быстрый способ получить этот результат?
Это наглядное изображение на моем графике. Синий представляет в настоящее время онлайн-пользователей, и красный совокупное число пользователей до сих пор видели сегодня:
Чтобы уточнить, в 17:00 часов 2 пользователи разъединены, а затем через 15 минут 2 новых пользователей, подключенных к серверу впервые с полуночи. Вы можете увидеть, как красная линия идет от 7 до 9, чтобы представить это. Аналогичным образом, новый пользователь впервые подключился сегодня в 23:00.
** Вам нужно показать нам определения таблиц и индексов **, а также подсчет строк для каждой из таблиц. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали. Не видя определения таблиц и индексов, мы не можем сказать. Нам также нужны подсчет строк, потому что это может сильно повлиять на оптимизацию запросов. Если вы знаете, как сделать «EXPLAIN» или получить план выполнения, поместите результаты в вопрос. Если у вас нет индексов, посетите http://use-the-index-luke.com. –
@ AndyLester Обязательно! Я редактировал мой OP. Дайте мне знать, достаточно ли этой информации. Приветствия. – Chris
@ Крис: У вас есть определение таблицы, но как насчет определения индекса? –