Более эффективно соединять T2 с T1, а не T1 с T2, когда у T1 много T2 с условием, удерживаемым в T2?Или это то же самое? - PullRequest
0 голосов
/ 30 сентября 2011

Я знаю, что следующие запросы возвращают то же самое:

SELECT `cimgs`.* 
FROM `cimgs`
INNER JOIN `cimgs_tags` ON `cimgs_tags`.`cimg_id` = `cimgs`.`id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

SELECT `cimgs`.*
FROM `cimgs_tags`
INNER JOIN `cimgs` ON `cimgs`.`id` = `cimgs_tags`.`cimg_id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

Но, на первый взгляд, я бы сказал, что первый дублирует таблицу cimgs для каждого тега перед проверкой условий, когда второй проверяет условия и затем присоединяется к соответствующим таблицам ...

Хотя я не знаю, обнаружит ли MySQL и оптимизирует ли это автоматически, и эти два запроса имеют одинаковую производительность?

Ответы [ 3 ]

3 голосов
/ 30 сентября 2011

Оптимизатор запросов сделает это за вас.Он будет использовать статистику индекса, которую вы должны обновлять с помощью ANALYZE TABLE .Вы можете принудительно установить порядок соединения, используя STRAIGHT_JOIN , и вы также можете принудительно использовать определенные индексы.

Вы можете сделать объяснение:

EXPLAIN SELECT `cimgs`.* 
FROM `cimgs`
INNER JOIN `cimgs_tags` ON `cimgs_tags`.`cimg_id` = `cimgs`.`id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

EXPLAIN SELECT `cimgs`.*
FROM `cimgs_tags`
INNER JOIN `cimgs` ON `cimgs`.`id` = `cimgs_tags`.`cimg_id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

, чтобы увидетьразличия.

Конечно, для левого или правого соединения есть семантическая разница.

3 голосов
/ 30 сентября 2011

Это не имеет значения из внутренних соединений.Таким же образом и порядок предложений WHERE

WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

WHERE (cimgs.id != 1) AND `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5)
  • Оптимизатор знает, что
  • SQL декларативный, а не процедурный.То есть вы говорите «что», а оптимизатор решает «как»
0 голосов
/ 30 сентября 2011

Мне кажется этот вопрос

отвечает на ваш вопрос.

"Для внутренних объединений порядок не имеет значения.
Для внешних объединений порядок имеет значение.
Если вы хотите форсировать определенный порядок, вы можете использовать STRAIGHT_JOIN."

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