Mysql 5.1 не использует индекс при соединении с результатами выбора - PullRequest
0 голосов
/ 28 июня 2019

У меня есть запрос вроде:

select * from x join (
    select * from y join z on y.id=z.id
) as t on x.name = t.name

Этот запрос занимает 5 минут в mysql 5.1, в то время как с тем же набором данных он занимает всего 100 миллисекунд в mysql 5.7. Mysql 5.1 не учитывает тот факт, что имя столбца является ключом во всех таблицах. В основном все таблицы имеют столбец name и они проиндексированы:

KEY `name_index` (`name`),

Я пытался использовать принудительный индекс, чтобы убедить сервер использовать индекс, но безрезультатно. Это означает, что обе версии жалуются на синтаксис.

select * from x join (
    select * from y join z on y.id=z.id
) as t force index(`name_index`) on x.name = t.name

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'принудительным индексом (name_index) для x.name = t.name' в строке 3

Кто-нибудь знает какой-нибудь обходной путь, заставляющий mysql использовать индекс по результатам объединения?

1 Ответ

0 голосов
/ 28 июня 2019

Вы можете попытаться преобразовать подзапрос в объединение, чтобы ваш устаревший MySQL 5.1 мог использовать индекс в этом случае.

SELECT
    x.*
FROM
    x
    INNER JOIN y ON (
        x.name = y.name -- It is not clear from original query where is the derived name cone from
    )
    INNER JOIN z ON (
        y.id = z.id
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...