У меня следующий запрос MySql:
select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1
Выполнение занимает около 30 секунд, что было странно, потому что, если я закомментирую соединение или предложение where, это займет меньше секунды: т.е.
select t1.*
from Table1 t1
where t1.FilterID = 1
или
select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
каждый занимает меньше секунды.
Затем есть ключевое слово STRAIGHT_JOIN, на которое я могу найти одну ссылку, здесь: http://dev.mysql.com/doc/refman/5.0/en/join.html
STRAIGHT_JOIN аналогичен JOIN, за исключением того, что левая таблица всегда читается перед правой таблицей.Это может быть использовано в тех (немногих) случаях, когда оптимизатор соединений размещает таблицы в неправильном порядке.
Что?Я могу написать:
select t1.*
from Table1 t1
STRAIGHT_JOIN Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1
и запрос будет выполнен менее чем за секунду.
Даже более странно, я могу написать:
select STRAIGHT_JOIN t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1
, и это займет меньше, чемво-вторых, и этот синтаксис кажется даже недопустимым.
Я думаю, второй пример означает, что STRAIGHT_JOIN будет использоваться всякий раз, когда пишется INNER JOIN, но я не могу найти какую-либо документацию по этому поводу..
Что здесь происходит и как «оптимизатор соединения» может привести к такой относительно низкой производительности?Должен ли я всегда использовать STRAIGHT_JOIN?Как определить, когда его использовать или нет?
Table1 и Table2 оба имеют целочисленные первичные ключи;FilterID - это внешний ключ к другой таблице;столбцы CommonID являются внешними ключами третьей таблицы.У них обоих есть индексы на них.Ядром базы данных является InnoDB.
Спасибо