Есть два запроса - один с EXISTS, второй с IN.
SELECT bl.id
FROM book_list bl
WHERE bl.active=1
AND EXISTS (SELECT id_book FROM book_codes bc WHERE bc.id_book = bl.id and bc.code LIKE '%f1%')
ORDER BY bl.id desc;
SELECT bl.id
FROM book_list bl
WHERE bl.active=1
AND bl.id in (SELECT id_book FROM book_codes bc WHERE bc.id_book = bl.id and bc.code LIKE '%f1%')
ORDER BY bl.id desc;
Не могу понять, почему первый запрос эффективнее, когда в строке для поиска через LIKE один символ, но чем больше символов я ищу через LIKE, тем первый запрос медленнее.
Второй запрос всегда отрабатывает приблизительно за одно и то же время.
Неважно, какой размер строки для поиска через LIKE, первый запрос по explain перебирает в book_codes порядка 10тыс записей, а второй - порядка 4мл по одному и тому же ключу id_book.
В book_codes > 4млн записей.
UPD:
Изначально я написала запрос через JOIN
SELECT bl.id
FROM book_list bl
JOIN book_codes bc on bc.id_book = bl.id
WHERE bl.active=1 AND bc.code LIKE '%ww%'
GROUP BY bl.id
ORDER BY bl.id desc;
Но на кодревью JOIN завернули и предложили
AND bl.id in (SELECT id_book FROM book_codes bc WHERE bc.id_book = bl.id and bc.code LIKE '%f1%')
Explain всех трех запросов
UPD UPD
По полю bс.code тоже есть индекс