У меня большая проблема с запросом, в котором мне нужно получить некоторые максимальные и минимальные значения, связанные с каждой строкой. Для упрощения этот запрос присоединяется к другой таблице, но я покажу только максимальный и минимальный запросы.
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