Оптимизация движущегося окна MYSQL-запроса - PullRequest
1 голос
/ 18 октября 2011

У меня есть MEMORY MYSQL база данных, которая содержит таблицу с 200k + строками.Я использую эту базу данных для тестирования торговых стратегий, поэтому она неоднократно запрашивается до тошноты.Новые данные не добавляются в базу данных.

Один столбец в основной таблице этой базы данных - «Время дня».При каждом запросе моя хранимая процедура выбирает те строки, где «Время дня» падает максимум за 2 часа до или через 2 часа после ввода запроса «Время дня».

Поскольку данные в моей базе данных имеют 5-минутное разрешение, существует всего 288 возможных "времен суток" (24 * 60/5 = 288).

Это означает, что каждый запрос выбирает примерно 1/288стола.Более того, это означает, что между запросом A и запросом B существует огромное перекрытие (которое следует сразу).

В данный момент существует просто 1 огромная таблица, которая фильтруется при каждом запросе.Это (слишком) медленно.

Я пытался найти более оптимальную настройку.Я рассмотрел создание 288 предварительно отфильтрованных таблиц и просто доступ к ним во время запроса.Это, однако, занимает слишком много оперативной памяти и в итоге замедляет запрос, а не ускоряет его.

Существуют ли более оптимальные решения?

1 Ответ

1 голос
/ 18 октября 2011

Вы можете просто добавить целочисленный столбец в таблицу, чтобы указать, в каком «окне» находится транзакция. Таким образом, поле будет содержать значение от 1 до 288 для каждой записи, которую необходимо обновить при однократном обновлении..

После этого запрос к таблице будет просто:

select * from mytable where window = 123

например.К этому столбцу необходимо добавить индекс.

Сказав это, я был бы удивлен, если бы он работал намного лучше, чем просто запрос к столбцу даты (при условии, что он, конечно, уже проиндексирован), но может бытьСтоит попробовать.

Фильтрация таблицы строк 200К с индексом по одному полю действительно должна быть очень быстрой.Вы убедились, что задержка вызвана механизмом базы данных, а не поиском результатов?

...