Я пытаюсь использовать следующий запрос к таблице с ~ 200k записей в ней. Есть множество других полей, по которым можно фильтровать, но это базовый пример.
SELECT b.isbn FROM books b
WHERE
b.price IS NOT NULL AND
b.deleted = '' AND
b.publication_date <= '2009-12-04' AND
(
b.subject1_id IN ('CAT1','CAT2','CAT3','CAT4','CAT5') OR
b.subject2_id IN ('CAT1','CAT2','CAT3','CAT4','CAT5') OR
b.subject3_id IN ('CAT1','CAT2','CAT3','CAT4','CAT5')
)
В настоящее время у меня есть отдельный индекс для всех этих полей, и этот запрос занимает ~ 4,5 секунды, что слишком долго. EXPLAIN
списки NULL
под ключом.
Я также пытался создать один большой индекс, включающий все поля в приведенном выше запросе, но EXPLAIN
показывает, что этот многопольный индекс не используется.
Как я могу проиндексировать эти поля, чтобы ускорить мои запросы?
РЕДАКТИРОВАТЬ: Вот мои текущие индексы (ни один из которых, кажется, не используется запросом):
- индекс (цена)
- индекс (удалено)
- индекс (publication_date)
- индекс (subject2_id)
- индекс (subject3_id)
- index (цена, удалено, дата публикации, subject1_id, subject2_id, subject3_id)
РЕДАКТИРОВАТЬ 2: Ответ Per --ıu - после нормализации таблиц и использования, в основном, его запроса, он несколько ускоряет его (сейчас время составляет ~ 3,5 секунды), но не так сильно, как я ищу. Я проиндексировал новую таблицу как PRIMARY KEY (isbn, subject_id), и этот индекс используется для объединения.
EDIT3: я добавил дополнительный индекс для второй таблицы (subject_id, isbn), который помогает. Добавление другого индекса, о котором упоминается ниже, немного помогает, но используется только тогда, когда я использую «FORCE INDEX» в запросе. Сейчас примерно 1,5 секунды. Есть ли надежда получить его намного ниже?