результат запроса сортировки слишком медленный - PullRequest
3 голосов
/ 29 марта 2012

У меня проблема с большой таблицей в базе данных приложения RoR.

TABLE EVENTS:

create_table "events", :force => true do |t|
    t.integer  "id"
    t.integer  "device_id"
    t.string   "data_type"
    t.integer  "element_id"
    t.t.datetime "created_at"
end

Проблема в том, что я хочу найти запись в этой таблице по этому запросу:

SELECT SQL_NO_CACHE `events`.* FROM `events`
WHERE `events`.`device_id` = N AND `events`.`data_type` = 'S'
AND (`events`.`created_at` BETWEEN 'S' AND 'S')
ORDER BY events.created_at DESC LIMIT 1

Я хочу взятьпоследнее событие дня, поэтому упорядочите записи по created_at и выберите первый элемент.

К сожалению, операция сортировки стоит слишком дорого, тогда запрос выполняется слишком медленно.

MySQL долженсделать дополнительный проход, чтобы узнать, как получить строки в отсортированном порядке.

Sorting result  7.1760s 7.2565s 1176    8080    0   0

1 Ответ

0 голосов
/ 12 апреля 2012

Вы могли бы вести сводную таблицу ваших событий, где вы можете получить данные, возможно? Заполните его, используя триггеры, чтобы заполнить сводную таблицу. Таблица EVENT_SUMMARY будет просто содержать самую последнюю строку или указатель на последнюю строку, поэтому вам вообще не нужно будет выполнять сортировку по запросу. У меня это хорошо работало на таблице с 80 миллионами строк, и она работала хорошо.

Однако следует учитывать, что триггер вызовет проблемы с производительностью вставки, поскольку он выполняет дополнительную работу.

Зависит от того, сколько дезагрегаторов есть в сводной таблице, возможно, не лучший подход.

Сколько там данных? Как часто оно записывается (для каждого дезагрегатора)?

...