У меня есть таблица, в настоящее время около 1,3 М строк, в которой хранятся измеренные точки данных для нескольких разных параметров. Это 30 параметров.Получение последней строки, вставленной в таблицу для каждого «параметра»
Таблица:
* id
* station_id (int)
* comp_id (int)
* unit_id (int)
* p_id (int)
* timestamp
* value
У меня есть уникальный индекс: (station_id, comp_id, unit_id, p_id, timestamp)
В связи с временной меткой различаются для каждого параметра у меня есть трудности сортировки с помощью временной метки (я должен использовать группу с).
Итак, сегодня я выбираю последнее значение для каждого параметра по этому запросу:
select p_id, timestamp, value
from (select p_id, timestamp, value
from table
where station_id = 3 and comp_id = 9112 and unit_id = 1 and
p_id in (1,2,3,4,5,6,7,8,9,10)
order by timestamp desc
) table_x
group by p_id;
Этот запрос занимает около 3 секунд, чтобы выполнить. Несмотря на то, что у меня есть указатель, как указано выше, оптимизатор использует filesort для поиска значений.
Запрашивание только один конкретный параметр:
select p_id, timestamp, value from table where station_id = 3 and comp_id = 9112 and unit_id = 1 and p_id =1 order by timestamp desc limit 1;
не принимает никакого времени (0.00).
Я также попытался объединить идентификаторы параметров в таблицу, в которой я храню идентификатор параметра без везения.
Итак, существует ли простой (&) способ задать самые последние значения для нескольких строк с разными параметрами? Выполнение процедуры, выполняющей цикл с запросом для каждого параметра индивидуально, кажется намного быстрее, чем запрос всего за один раз, который, как мне кажется, не является способом использования базы данных.
Спасибо, я проверю запрос сегодня вечером. Вопрос. Есть ли разница в производительности с использованием INDEX против UNIQUE? – Easyrider
Оба создают индекс, поэтому они должны быть эквивалентными. –
Это работало довольно аккуратно. Большое спасибо! Время выполнения - от 3 секунд до 0,4 секунды. – Easyrider