У меня есть таблица контактов, у которой есть первичный ключ id.Он также имеет вторичный индекс idx_id_del_user (id, удаленный, user_id).
В следующем запросе используется индекс, и поэтому он очень быстрый -
select id
from jts_contacts
where id = '00000402-25c8-7375-e3df-4ec5b66de11d'
and deleted = 0;
1 строка, выбранная за 0,0098 с
Однако, когда я использую предложение in, внешний запрос переходит в полное сканирование таблицы.Я ожидаю, что он будет использовать либо первичный ключ, либо idx_id_del_user.
select *
from jts_contacts FORCE INDEX (idx_id_del_user)
where id in
(select id
from jts_contacts
where id = '00000402-25c8-7375-e3df-4ec5b66de11d')
and deleted = 0
1 строка, выбранная за 9 с
Объяснить план -
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
------------------------------------------------------------------------------------
1, 'PRIMARY', 'jts_contacts', 'ALL', '', '', '', '', 1127275, 'Using where'
2, 'DEPENDENT SUBQUERY', 'jts_contacts', 'const', 'PRIMARY,idx_id_del_user', 'PRIMARY', '108', 'const', 1, 'Using index'
В этой таблице 1,2миллион записей и таблица была проанализирована.Я пробовал без параметра FORCE INDEX, но он по-прежнему не использует индекс.Любые предложения по ускорению этого запроса?
Предостережение: использование объединения вместо предложения in будет работать, однако, поскольку это сгенерированный запрос из существующего продукта - его нельзя изменить для использования объединений.