2012-05-19 4 views
0

Мой набор данных - это таблица с тремя строками: идентификатор жесткого диска, процентное расстояние от пустого пространства, метка времени. Таблица добавляется с новым состоянием каждого жесткого диска (1200 из них) каждые 20 минут.MySQL: выбор данных на основе временного интервала

Если я хочу выбрать последнее состояние своего пула жестких дисков, я буду использовать MAX (временную метку) и MIN (временную метку), если я хочу самого старого.

Но скажите, что у меня заданная метка времени, как я могу попросить MySQL получать данные более или менее X секунд вокруг этой метки времени?

ответ

1
WHERE yourTimeStamp 
    between TIMESTAMPADD(SECOND,-3,yourtimestamp) 
     and TIMESTAMPADD(SECOND, 3,yourtimestamp) 

, где -3 до + 3 был заменен на X

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestampadd для получения дополнительной помощи.

+0

это работает! но он очень медленный. Любая идея о том, как ускорить эту задачу? – Cystack

+0

Мне нужно будет увидеть соединения. Возможно, есть способ рассчитать timestampadd ONCE и использовать его для каждой записи вместо каждой записи. Я также должен увидеть, как вы получаете «MAX» и еще несколько вещей. SQL, который вы используете вместе с планом выполнения, поможет определить, где узкое место и что делать, чтобы разрешить производительность. – xQbert

1

Как это:

WHERE timestamp BETWEEN DATE_SUB('<given_timestamp>', INTERVAL 5 SECOND) 
    AND DATE_ADD('<given_timestamp>', INTERVAL 5 SECOND); 

Как уже упоминалось в другой ответ, ваш запрос медленно, когда выбор основан на timestamp поле.

Вы можете добавить INDEX на этой колонке, чтобы ускорить его:

ALTER TABLE <table_name> ADD INDEX(`timestamp`) 

Обратите внимание, что в зависимости от размера вашей таблицы, первый раз при добавлении индекса требуется некоторое время. Во-вторых, он замедляет запросы INSERT и добавляет размер вашей базы данных. Это все по-другому, поэтому вам просто нужно выяснить, тестируя.

+0

дает синтаксическую ошибку:/ – Cystack

+0

@ Cystack извините, вы правы. исправлено, что ... btw, чтобы ускорить запросы, основанные на вашем поле timetstamp, вам нужно добавить индекс в этот столбец –

+0

, он уже проиндексирован, он занимает около 16 секунд, что, я думаю, довольно длинное:/ваш код работает сейчас хотя;) и так же быстро (или как медленно), как и другое! спасибо – Cystack