Как оптимизировать этот запрос MySQL? (движущееся окно) - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть огромная таблица (400 тыс. + Строк), где каждая строка описывает событие на рынке Форекс. Первичным ключом таблицы является целое число с именем «pTime» - это время, когда событие произошло в POSIX время.

Моя база данных неоднократно запрашивается моим компьютером во время симуляции, которую я постоянно запускаю. Во время этой симуляции я передаю входную pTime (я называю это qTime) процедуре MySQL. qTime - это точка запроса из той же огромной таблицы. Используя qTime, моя процедура фильтрует таблицу в соответствии со следующим правилом:

Выберите только те строки, чье время pTime составляет максимум 2 часа от входного qTime в любой день.

ех.

query point: `2001-01-01  07:00`
                                 lower limit: `ANY-ANY-ANY 05:00`
                                 upper limit: `ANY-ANY-ANY 09:00`     

После этого запроса точка запроса сместится на 1 строку (5 минут), и будет инициирован новый запрос:

query point: `2001-01-01  07:05`
                                 lower limit: `ANY-ANY-ANY 05:05`
                                 upper limit: `ANY-ANY-ANY 09:05`     

Вот как я этого добиваюсь:

SELECT * FROM mergetbl WHERE
TIME_TO_SEC(TIMEDIFF(FROM_UNIXTIME(pTime,"%H:%i"),FROM_UNIXTIME(qTime,"%H:%i")))/3600
BETWEEN -2 AND 2

Хотя у меня есть индекс на pTime, этот фрагмент кода значительно замедляет мое программное обеспечение.

Я хотел бы предварительно обработать этот оператор для каждого значения pTime (которое позже будет служить входом qTime), но я не могу найти способ сделать это.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Если вы полагаетесь только на время - я бы предложил вам добавить еще один столбец типа time с долей времени pTime и выполнять запросы над ним

2 голосов
/ 22 сентября 2011

Ваш запрос все еще должен сканировать каждое значение из-за того, как вы тестируете время в определенных диапазонах, которые не охватывают индекс.

Вам необходимо разделить свое время на другое поле и индексировать дляиспользуйте индекс здесь.

(примечание: ответ был отредактирован, чтобы исправить мое первоначальное недопонимание вопроса)

1 голос
/ 22 сентября 2011

DATETIME - неправильный тип в этом случае, потому что ни одна система хранения данных DATETIME, о которой я знаю, не сможет использовать индекс, если вы исследуете только часть TIME значения.Простая оптимизация заключается в том, чтобы, как уже говорили другие, хранить время отдельно в поле типа данных TIME (или, возможно, какого-то целочисленного смещения) и индекса , что .

Если вы действительно хотитедве части информации в одном столбце вам придется свернуть в свой собственный формат данных, отдавая приоритет типу времени.Вы можете использовать строковый тип в формате ЧЧ: ММ: СС ГГГГ-ММ-ДД или поле NUMERIC, в котором целая числовая часть представляет собой смещение в секундах от полуночи, а десятичная часть - в днях от ссылки.-дата смещения.

Кроме того, учитывайте, какое значение будет иметь индекс.Если ваш диапазон составляет четыре часа, при условии равномерного распределения в течение дня, этот индекс вернет 17% вашей базы данных.Хотя это принесет некоторую пользу, если вы делаете какую-либо другую фильтрацию, я постараюсь включить это и в ваш индекс.

...