2014-11-16 1 views
1

У меня есть таблица с несколькими миллионами записей данных. Я пытаюсь найти минимум и максимум для каждой группы для одного элемента быстро.Найти минимум в группах в большом значении MySQL (используя существующий индекс) быстро

Структура как этот

  • "GroupC" VarChar 10
  • "Пункт" Integer
  • "LogDT"
  • кодировки даты и времени
  • многих других областях.

В списке «GROUPC»/«LogDT» есть индекс, и существует менее 10 групп.

Когда я прошу один минимум GroupC/Item, я получить быстрый ответ в 100мс

Пример: Пункт 59

select GROUPC, min(LogDT) from TABLE as T where T.Item=59 and t.GROUPC='GR1' 

мне нужно минимум для всех групп.

select GROUPC, min(LogDT) from TABLE as T where T.Item=59 group by t.GROUPC 

Это работает, но занимает 12 секунд, хотя есть только 3 группы.

Получение списка групп занимает всего 15мс

select distinct GROUPC from TABLE 

Любые идеи, как я могу объединить эти два запроса в то скорое?

+0

Отмечено. Я использовал «GROUP» в качестве замены для реального имени поля в своем коде, чтобы упростить мой вопрос. Будет обновлен вопрос – 576i

ответ

1

У вас есть индекс по GROUP и LogDT колонны, и это хорошо, поэтому я считаю, что этот запрос будет довольно быстро:

SELECT GROUP, MIN(LOGDT) FROM TABLE AS t GROUP BY t.GROUP 

, но так как вы фильтрации по п = 59, и вы не индекс на столбце Элемент, ваш запрос будет медленным:

SELECT GROUP, MIN(LogDT) FROM TABLE as T WHERE T.Item=59 GROUP BY t.GROUP 

Я подозреваю, что ваш первый запрос быстро, потому что группа GR1 содержит меньше элементов, чем другие группы:

SELECT GROUP, MIN(LogDT) FROM TABLE as T WHERE T.Item=59 AND t.GROUP='GR1' 

, но если вы попытаетесь фильтровать другие группы (например. GR2, GR3, ...), вы можете получить более медленные характеристики.

Вы могли бы дать этот код попробовать, но я не думаю, что это сделает улучшение:

SELECT GROUP, MIN(LogDT) FROM TABLE as T 
WHERE T.Item=59 AND t.GROUP IN (SELECT DISTINCT GROUP FROM TABLE) 
GROUP BY t.GROUP 

Единственный способ улучшить свои выступления, чтобы добавить индекс на Item колонке.

+0

спасибо за предложение. Возможно, мне придется использовать дополнительный индекс. – 576i

+0

использовал предложение для дополнительного индекса в конце концов – 576i