Я использую H2, и у меня есть база данных книг (таблицы Entries) и авторов (таблица Persons), связанных через отношение многие ко многим, которые сами хранятся в таблице Authorship.База данных довольно большая (900 000 человек + 2,5 млн. Книг).
Я пытаюсь эффективно выбрать список всех книг, созданных хотя бы одним автором, чье имя соответствует шаблону (LIKE '%шаблон%').Хитрость в том, что шаблон должен строго ограничивать количество подходящих авторов, и у каждого автора есть достаточно небольшое количество связанных книг.
Я пробовал два запроса:
SELECT p.*, e.title FROM (SELECT * FROM Persons WHERE name LIKE '%pattern%') AS p
INNER JOIN Authorship AS au ON au.authorId = p.id
INNER JOIN Entries AS e ON e.id = au.entryId;
и:
SELECT p.*, e.title FROM Persons AS p
INNER JOIN Authorship AS au ON au.authorId = p.id
INNER JOIN Entries AS e ON e.id = au.entryId
WHERE p.name like '%pattern%';
Я ожидал, что первый будет намного быстрее, так как я присоединяюсь к гораздо меньшей (под) таблице авторов, однако они оба занимают много времени.До тех пор, пока я на самом деле могу вручную разбить запрос на три выбора и быстрее найти нужный результат.
Когда я пытаюсь ОБЪЯСНИТЬ запросы, я вижу, что они действительно очень похожи (полное соединениетаблицы и только затем предложение WHERE), поэтому мой вопрос: как я могу добиться быстрого выбора, основанного на том факте, что фильтр по авторам должен привести к гораздо меньшему объединению с двумя другими таблицами?
Обратите внимание, что я пробовал те же запросы с MySQL и получил результаты в соответствии с тем, что я ожидал (выбор первого намного быстрее).
Спасибо.