Сорри за невнятный заголовок, но это лучшее, что я смог придумать для своей проблемы.
Итак, есть таблица, в которую записываются результаты некоторого эксперимента. События происходят нерегулярно, т.е. могут быть периоды, когда они происходят каждую секунду (но не чаще), а могут быть «застои» по несколько минут
CREATE TABLE experiment
(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Ключ записи',
event_timestamp BIGINT UNSIGNED NOT NULL COMMENT 'Дата и время эксперимента',
ex_value DECIMAL(11,4) NOT NULL COMMENT 'Результат эксперимента ',
PRIMARY KEY ( id ),
UNQUE ( event_timestamp )
) ENGINE=INNODB
Есть вторая таблица следующего вида, которая также содержит нерегулярные по времени события, в нее попадают случайные записи со значениями event_timestamp, которых может и не быть в таблице experiment:
CREATE TABLE random_events
(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Ключ записи',
event_timestamp BIGINT UNSIGNED NOT NULL COMMENT 'Дата и время эксперимента',
prev_event_timestamp BIGINT UNSIGNED NULL DEFAULT 0 COMMENT 'Дата и время предыдущего эксперимента',
next_event_timestamp BIGINT UNSIGNED NULL DEFAULT 0 COMMENT 'Дата и время следующего эксперимента',
PRIMARY KEY ( id ),
INDEX ( event_timestamp )
) ENGINE=INNODB
Задача состоит в том, чтобы заполнить prev_event_timestamp и next_event_timestamp в таблице random_events соответствующими значениями из таблицы experiment. Иными словами, нужно узнать между какими двумя ближайшими экспериментами находится точка в таблице random_events.
Сейчас я делаю так для prev_event_timestamp:
UPDATE random_events
SET random_events.prev_event_timestamp = (
SELECT event_timestamp
FROM experiment
WHERE experiment.event_timestamp <= random_events.event_timestamp
ORDER BY experiment.event_timestamp DESC
LIMIT 1
)
и вот так для next_event_timestamp:
UPDATE random_events
SET random_events.next_event_timestamp = (
SELECT event_timestamp
FROM experiment
WHERE experiment.event_timestamp > random_events.event_timestamp
ORDER BY experiment.event_timestamp ASC
LIMIT 1
)
Все отлично работает, но с увеличением числа записей в random_events >10K все начинает очень тормозить. Причем, второй запрос отрабатывает в пять раз быстрее, чем первый.
Возможно, нужно подкрутить какие-то настройки в my.ini, создать индексы или изменить (переписать совсем иначе) запрос или что-то еще? Вдруг, кто-то уже эффективно решил аналогичную задачу у себя…
Спасибо.