2014-12-10 5 views
0

У меня есть таблица, в настоящее время около 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).

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

Итак, существует ли простой (&) способ задать самые последние значения для нескольких строк с разными параметрами? Выполнение процедуры, выполняющей цикл с запросом для каждого параметра индивидуально, кажется намного быстрее, чем запрос всего за один раз, который, как мне кажется, не является способом использования базы данных.

ответ

1

Ваш запрос неверен. Вы суммируете по p_id, но в том числе и другие столбцы. Они приходят из неопределенных строк, а documentation совершенно ясно:

MySQL расширяет применение GROUP BY так, чтобы выбрать список можно обратиться к неагломерированным столбцам не указанным в GROUP BY предложения. Это означает , что предыдущий запрос является законным в MySQL. Вы можете использовать эту функцию , чтобы получить лучшую производительность, избегая ненужной сортировки столбцов и группировки . Однако это полезно, прежде всего, когда все значения в каждом неагрегационном столбце, не названном в GROUP BY, одинаковы для каждой группы . Сервер может выбирать любое значение из каждой группы, поэтому , если они не совпадают, выбранные значения являются неопределенными. Кроме того, выбор значений из каждой группы не может быть под влиянием добавления предложения ORDER BY.

должно работать:

select p_id, timestamp, value 
from table t join 
    (select p_id, max(timestamp) as maxts 
     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 
    ) tt 
    on tt.pid = t.pid and tt.timestamp = t.maxts; 

Лучший показатель для этого запроса является составной индекс на table(station_id, comp_id, unit_id, p_id, timestamp).

+0

Спасибо, я проверю запрос сегодня вечером. Вопрос. Есть ли разница в производительности с использованием INDEX против UNIQUE? – Easyrider

+0

Оба создают индекс, поэтому они должны быть эквивалентными. –

+0

Это работало довольно аккуратно. Большое спасибо! Время выполнения - от 3 секунд до 0,4 секунды. – Easyrider

Смежные вопросы