Когда использовать STRAIGHT_JOIN с MySQL

Вот сценарий, который недавно mysql возник на работе.

Рассмотрим mysql-table три таблицы: A, B, C.

В A mysqlclient 3000 строк; B имеет 300000000 join строк; а в C - 2000 строк.

Определены mysql-if внешние ключи: B (a_id), B mysqlclient (c_id).

Предположим, у вас mysqldump есть запрос, который выглядит mysql-if так:

select a.id, c.id
from a
join b on b.a_id = a.id
join c on c.id = b.c_id

По моему опыту, в этом sql-join случае MySQL может выбрать mysql вариант C -> B -> A. C меньше mysql-query A, а B огромен, и все они mysqlsh равнозначны.

Проблема в том, что mysqldump MySQL не обязательно учитывает mysql-query размер пересечения между joins (C.id и B.c_id) и (A.id и mysql-if B.a_id). Если соединение mysql-table между B и C возвращает столько mysqlclient же строк, сколько B, то это mysql-if очень плохой выбор; если my-sql бы, начиная с A, можно было mysql-query бы отфильтровать B до такого mysql-server количества строк, как A, тогда my-sql это было бы гораздо лучшим mysqld выбором. straight_join можно использовать mysql для принудительного выполнения mysql-server этого порядка следующим образом:

select a.id, c.id
from a
straight_join b on b.a_id = a.id
join c on c.id = b.c_id

Теперь join a необходимо присоединить mysql-table до b.

Обычно вы хотите выполнять mysql-server соединения в таком порядке, который mysqldump минимизирует количество строк mysqlclient в результирующем наборе. Итак, начать joins с небольшой таблицы и объединить jointable так, чтобы результирующее join соединение также было небольшим, - это jointable идеальный вариант. Все становится join грушевидным, если, начиная mysql с маленького стола, и присоединяя mysqldump его к большему столу, получается jointable такое же большое, как и большой mysqlsh стол.

Это зависит от статистики. Если sql-join распределение данных изменится, расчет mysql-table может измениться. Это также my-sql зависит от деталей реализации mysql механизма соединения.

Худшие mysql-query случаи, которые я видел для mysql-if MySQL, которые почти не требовали sql-join straight_join или агрессивного хинтинга sql-join индекса, - это запросы, которые mysql-table разбивают на страницы большое join количество данных в строгом mysqlsh порядке сортировки с легкой my-sql фильтрацией. MySQL настоятельно mysql-table предпочитает использовать mysql-table индексы для любых фильтров mysqlsh и объединений вместо сортировок; это jointable имеет смысл, потому что большинство joins людей не пытаются отсортировать mysqlsh всю базу данных, а скорее sql-join имеют ограниченное подмножество mysql-server строк, которые реагируют mysql на запрос, а сортировка ограниченного join подмножества происходит намного sql-join быстрее, чем фильтрация всей my-sql таблицы, независимо от того, отсортирована join она или нет. В этом случае, если mysqlsh поместить прямое соединение jointable сразу после таблицы, в которой mysql-if был индексированный столбец, я mysqldump хотел отсортировать фиксированные my-sql элементы.

mysql

join

2022-11-01T18:45:31+00:00