Выберите строки, которые менее 5 минут, используя DATE_SUB - PullRequest
8 голосов
/ 02 февраля 2012

У меня есть таблица, которая получает сотни запросов в минуту.У меня проблема в том, что мне нужен способ выбрать только те строки, которые были вставлены за последние 5 минут.Я пытаюсь это:

SELECT count(id) as count, field1, field2
FROM table
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
ORDER BY timestamp DESC

Моя проблема заключается в том, что он возвращает 70k + результатов и подсчета.Я не уверен, что я делаю неправильно, но я хотел бы получить помощь по этому вопросу.Кроме того, если бы был способ сгруппировать их по минутам, чтобы это выглядело так:

| count | field1 | field2 | 
----------------------------

Мне бы очень понравилась помощь и руководство по этому вопросу, поэтому, пожалуйста, дайте мне знать ваши мысли.

Ответы [ 2 ]

13 голосов
/ 02 февраля 2012

Вам на самом деле не нужно DATE_ADD/DATE_SUB, арифметика даты намного проще:

SELECT COUNT(id), DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%i')
FROM `table`
WHERE `timestamp` >= CURRENT_TIMESTAMP - INTERVAL 5 MINUTE
GROUP BY 2
ORDER BY 2
2 голосов
/ 02 февраля 2012

Кажется, что это сработает, что очень близко к тому, что вы имели:

SELECT 
  MINUTE(date_field) as `minute`,
  count(id) as count
FROM table 
WHERE date_field > date_sub(now(), interval 5 minute)
GROUP BY MINUTE(date_field)
ORDER BY MINUTE(date_field);

Обратите внимание на добавленный столбец для отображения минуты и предложение GROUP BY, в котором результаты собраны в соответствующую минуту. Представьте, что у вас было 5 маленьких ведер с надписью за последние 5 минут. Теперь представьте, что вы бросили каждый ряд, которому было 4 минуты, в свое ведро. Затем count () подсчитает количество записей, найденных в каждом сегменте. Это быстрая визуализация того, как работает GROUP BY. http://www.tizag.com/mysqlTutorial/mysqlgroupby.php выглядит неплохой рецензией на GROUP BY, если вам нужна дополнительная информация.

Если вы запустите это, а количество записей в минуту кажется слишком большим, вам нужно будет устранить неполадки. Попробуйте заменить COUNT (id) на MAX (date_field) и MIN (date_field), чтобы вы могли понять, какие именно даты он собирает. Если значения MIN () и MAX () находятся внутри диапазона, возможно, в вашу базу данных записано больше данных, чем вы думаете.

Вы также можете дважды проверить, что у вас нет дат в будущем, поскольку все они будут> сейчас (). Упомянутые выше проверки MIN () / MAX () также должны идентифицировать это, если это проблема.

...