2011-04-04 2 views
1

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

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) 

Если я ВЫПОЛНИТЬ объяснить, он говорит, что это «первый присоединиться» использует временный и FileSort, и это делает базу данных, чтобы свернуть в этой точке, используя почти 100% CPU на некоторое время.

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 

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

EDIT: Проблема теперь более сфокусирована. Если мы выполняем только второй подзапрос:

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 
+0

Можете ли вы разместить свои структуры таблиц? это может помочь увидеть индексы в частности. – Jaydee

+0

@jaydee: Я разместил индексы и новую информацию. Проблема заключается в одном из подзапросов. –

+0

Возможно, вам нужен один индекс для «Device_id, Referral» и один для «Device_id» – Timo

ответ

0

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

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

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