У меня есть запрос на выбор из другого подзапроса выбора. Хотя два запроса выглядят практически одинаково, второй запрос (в этом примере) выполняется намного медленнее:
SELECT
user.id
,user.first_name
-- user.*
FROM user
WHERE
user.id IN (SELECT ref_id
FROM education
WHERE ref_type='user'
AND education.institute_id='58'
AND education.institute_type='1'
);
Этот запрос занимает 1.2s Объяснить результаты этого запроса:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY user index first_name 152 141192 Using where; Using index
2 DEPENDENT SUBQUERY education index_subquery ref_type,ref_id,institute_id,institute_type,ref_type_2 ref_id 4 func 1 Using where
Второй запрос:
SELECT
-- user.id
-- user.first_name
user.*
FROM user
WHERE
user.id IN (SELECT ref_id
FROM education
WHERE ref_type='user'
AND education.institute_id='58'
AND education.institute_type='1'
);
Требуется 45 секунд для запуска с объяснением:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY user ALL 141192 Using where
2 DEPENDENT SUBQUERY education index_subquery ref_type,ref_id,institute_id,institute_type,ref_type_2 ref_id 4 func 1 Using where
Почему это медленнее, если я запрашиваю только по индексным полям?
Почему оба запроса сканируют всю длину пользовательской таблицы?
Есть идеи как улучшить?
Спасибо.