Рассмотрим следующий запрос:Использование индекса в LEFT JOIN с ИЛИ условие
SELECT *
FROM table1
LEFT JOIN table2 ON
table2.some_primary_key = table1.some_primary_key
LEFT JOIN table3 ON
table3.some_primary_key = table1.some_primary_key OR -- this is the issue
table3.column_with_index = table2.column_with_index
в то время как я проверяю EXPLAIN
он мне показывает индекс не используется для table3
присоединения (однако показатели приведены в «possible_keys»). Тип: «ВСЕ». Согласно manual:
типа «ALL» Регистрация: полное сканирование таблицы выполняется для каждой комбинации строк из предыдущих таблиц .
Запрос ужасно медленный.
Но когда я удалить одно из условий, так что будет:
LEFT JOIN table3 ON
table3.some_primary_key = table1.some_primary_key
ИЛИ
LEFT JOIN table3 ON
table3.column_with_index = table2.column_with_index
Mysql использует индексы правильно. В EXPLAIN
показатели результата показаны в столбце «ключи», тип - «ref». Запросы быстро растут.
Что делать, чтобы mysql использовал мои индексы при использовании OR
в заявлении о соединении?
Я пробовал LEFT JOIN table3 FORCE INDEX(PRIMARY, ind_column)
, но не удался.
Я думаю, что многие базы данных имеют проблема с использованием индексов с 'OR'. – Barmar
Сколько у вас свободы в проекционной части вашего запроса? –
Я хочу загрузить все данные в один большой запрос, извините, я не могу быть более конкретным. До сих пор мне приходит в голову, что две таблицы3 соединяются (table3a, table3b) и 'CASE' в' SELECT' (если table3a primary not null, используйте поля table3a, если table3b primary not null использует поля table3b). Может быть, я могу пойти на другие обходные пути, но я задал этот вопрос, потому что мне любопытно, есть ли какое-либо действительно хорошее решение для этой проблемы. – Peter