MariaDB / MySQL: индексная подсказка игнорируется при левом соединении - PullRequest
0 голосов
/ 06 декабря 2018

Учтите, что в таблице отгрузки и заказа есть 2M записей.

SELECT DISTINCT
    s0_.id         AS id0,
    s0_.updated_at AS updated_at1
FROM
    `shipment` s0_
        LEFT JOIN `order` s1_ ON s0_.order_id = s1_.id -- These line
        LEFT JOIN `address` s2_ ON s1_.shipping_address_id = s2_.id -- These line
ORDER BY s0_.updated_at DESC
LIMIT 20 OFFSET 0

Если я удалю левое соединение, MariaDB будет использовать указанный индекс, почему?Есть ли решение?

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

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

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

Этот SQL генерируется библиотекойи у меня ограниченные возможности для его исправления.

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

Не спрашиватьмне убрать это.Я знаю, что это бесполезно.И я думаю, что оптимизатор запросов должен думать так же, поскольку он просто LEFT JOIN.

Я использую MariaDB 10.1

1 Ответ

0 голосов
/ 06 декабря 2018

Левое соединение должно найти order_id груза перед тем, как заказывать вывод.

Форсировать индекс обычно неправильно, даже если он может обнаружить некоторые вещи.

Используйте составной индекс shipment(order_id, updated_at), и вам не нужно будет принудительно устанавливать индекс.

ref: составные индексы оптимизация запросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...