'использование временных' с запросами max и min в mysql - PullRequest
1 голос
/ 04 апреля 2011

У меня есть большая проблема с запросом, в котором мне нужно получить некоторые максимальные и минимальные значения, относящиеся к каждой строке.Для упрощения этот запрос объединяется с другой таблицей, но я покажу только запросы max и min.

SELECT mv . * , mu . * 
FROM (

    SELECT Device_id, MAX( Last_time ) AS last_visit, 
                      MIN( Last_time ) AS first_visit
    FROM device_tracker
    GROUP BY Device_id
)mv
JOIN (
    SELECT Referral AS current_url, 
    Device_id, MAX( Last_time ) AS last_url_visit, MIN(Last_time ) AS first_url_visit
    FROM device_tracker GROUP BY Device_id, current_url) mu 
ON ( mv.Device_id = mu.Device_id )

Если я выполняю объяснение, он говорит, что это «первое соединение» используетВременная и файловая сортировка, и это приводит к краху базы данных в этот момент, используя почти 100% ЦП некоторое время.

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    7275     
1   PRIMARY <derived3>  ALL NULL    NULL    NULL    NULL    15137   Using where
3   DERIVED device_tracker  index   NULL    index_api   522 NULL    28392   Using index; Using temporary; Using filesort
2   DERIVED device_tracker  range   NULL    index_api   257 NULL    7099    Using index for group-by

вопрос: есть ли способ заставить этот запрос использовать индекс, чтобы избежать временной и файловой сортировки?Заранее спасибо !!!

РЕДАКТИРОВАТЬ : Проблема более сфокусирована.Если мы выполним только второй подзапрос:

EXPLAIN SELECT Referral, Device_id, MAX( Last_time ), MIN( Last_time )
FROM device_tracker
GROUP BY Device_id, Referral

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  device_tracker  index   NULL    index_api   522 NULL    28412   Using index; Using temporary; Using filesort

и мы установим эти индексы:

NAME:      TYPE:     ROWS:  FIELDS:
PRIMARY    PRIMARY   28413  id
index_api  INDEX     28413  Device_id, Last_Time, Referral

1 Ответ

0 голосов
/ 04 апреля 2011

Есть ли у вас индекс (device_id, Last_time) на устройстве отслеживания?А также (Device_id, refferal, Last_time).

У индексов и GROUP BY могут быть довольно сложные проблемы.

...