Я пытаюсь использовать следующий запрос в таблице с записями ~ 200k. Есть всевозможные другие поля, которые можно отфильтровать, но это базовый пример.Стратегия индексации MySQL
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
показывает, что этот многопоточный индекс не используется.
Как я могу индексировать эти поля, чтобы ускорить мои запросы?
EDIT: Вот мои текущие показатели (ни один из которых, кажется, можно использовать по запросу):
- индекс (цена)
- индекс (удален)
- индекс (publication_date)
- индекс (subject1_id)
- индекс (subject2_id)
- индекс (subject3_id)
- индекс (цена, удаление, publication_date, subject1_id, subject2_id, subject3_id)
EDIT2: За ответ ʞɔıu в - после нормализации таблиц и используя в основном его запрос, он делает его ускорить некоторые (время составляет ~ 3,5 секунды сейчас), но не столько, сколько я ищу. Я проиндексировал новую таблицу как PRIMARY KEY (isbn, subject_id), и этот индекс используется для соединения.
EDIT3: Я добавил дополнительный указатель на вторую таблицу (subject_id, isbn), что помогает. Добавление другого индекса, о котором упоминается ниже ʞɔıu, помогает немного, но используется только тогда, когда я использую «FORCE INDEX» в запросе. Сейчас около 1,5 секунд. Есть ли надежда получить его намного ниже?
попробуйте добавить еще один индекс (при условии, ISBN) по теме таблицы –
также с учетом того же присоединиться добавить индекс (ISBN, publish_date, deleted, price) в таблице книг –