MySQL
может выполнять только вложенные циклы (возможно, с использованием индексов), поэтому, если обе таблицы объединения проиндексированы, время для соединения вычисляется как A * log(B)
, если A
лидирует, и B * log(A)
, если B
является ведущим.
Легко видеть, что таблица с меньшим количеством записей, удовлетворяющих условию WHERE
, должна быть ведущей.
Существуют и другие факторы, влияющие на производительность соединения,такие как WHERE
условия, ORDER BY
и LIMIT
предложения и т. д. MySQL
пытается предсказать время для заказов на объединение, и, если статистика актуальна, это хорошо.
STRAIGHT_JOIN
полезно, когда статистика не точна (скажем, естественно искажена) или в случае ошибок в оптимизаторе.
Например, следующее пространственное соединение:
SELECT *
FROM a
JOIN b
ON MBRContains(a.area, b.area)
подвергаетсяобмен соединениями (меньшая таблица становится ведущей), однако MBRContains
не преобразуется в MBRWithin
, и результирующий план не использует индекс.
В этом случае следует явно установить соединениезаказать тебяпеть STRAIGHT_JOIN
.