2015-02-26 3 views
3

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

так что мне интересно, если есть более быстрый способ получить этот результат?

Это наглядное изображение на моем графике. Синий представляет в настоящее время онлайн-пользователей, и красный совокупное число пользователей до сих пор видели сегодня:

enter image description here

Чтобы уточнить, в 17:00 часов 2 пользователи разъединены, а затем через 15 минут 2 новых пользователей, подключенных к серверу впервые с полуночи. Вы можете увидеть, как красная линия идет от 7 до 9, чтобы представить это. Аналогичным образом, новый пользователь впервые подключился сегодня в 23:00.

+4

** Вам нужно показать нам определения таблиц и индексов **, а также подсчет строк для каждой из таблиц. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали. Не видя определения таблиц и индексов, мы не можем сказать. Нам также нужны подсчет строк, потому что это может сильно повлиять на оптимизацию запросов. Если вы знаете, как сделать «EXPLAIN» или получить план выполнения, поместите результаты в вопрос. Если у вас нет индексов, посетите http://use-the-index-luke.com. –

+0

@ AndyLester Обязательно! Я редактировал мой OP. Дайте мне знать, достаточно ли этой информации. Приветствия. – Chris

+0

@ Крис: У вас есть определение таблицы, но как насчет определения индекса? –

ответ

3

Поскольку я не вижу и не индексирую определение, я предполагаю, что его там нет. Что вам нужно сделать, это добавить индекс на запрос выполняется:

Примечание это, скорее всего, вызовет замедление вставки/обновления.

+0

Спасибо за ваш ответ. У меня есть «ПЕРВЫЙ КЛЮЧ». Этого недостаточно? – Chris

+0

Первичный ключ всегда индексируются, но вы также делаете выбор подзапросов с SELECT DISTINCT t.scan_id, t1.username поэтому вам нужно добавить все эти –

+0

О, я вижу. Поэтому просто уточнить: все, что мне нужно сделать, это добавить индекс в столбец «scan_id», а другой - в столбец «имя пользователя», правильно? Пример: 'CREATE INDEX scan_id ON stats_table (scan_id);'? – Chris

Смежные вопросы