LEFT JOIN быстрее INNER JOIN?

12 3
D
На сайте с 28.06.2008
Offline
1101
6480

Продолжаю заниматься оптимизацией запросов и заметил такую штуку - уже на 5-м запросе типа SELECT замена INNER на LEFT ускоряет запрос как миниму в 2 раза, а то и в 10. Почему так происходит?

Вот пример - время выполнения 4 сек.

SELECT t1.id, t1.created, t1.description, t2.title,
CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table1 AS t1
INNER JOIN table2 AS t2 ON t1.object_id = t2.id AND t1.object_group = 'com_group'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id
ORDER BY t1.id DESC LIMIT 3;

Меняем INNER на LEFT - результат запроса остается тот же, а время сокращается до 0,005

SELECT t1.id, t1.created, t1.description, t2.title,
CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.object_id = t2.id AND t1.object_group = 'com_group'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id
ORDER BY t1.id DESC LIMIT 3;
jpg 166854.jpg
LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#1



---------- Добавлено 23.09.2017 в 12:36 ----------

Ну и ещё к изучению: http://blog.sergey-lysenko.ru/2011/12/inner-left-and-right-joins.html

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
C
На сайте с 04.02.2005
Offline
277
#2
Dram:
Меняем INNER на LEFT - результат запроса остается тот же, а время сокращается до 0,005

Но у вас и результат должен быть разный

1-й запрос != 2-му запросу


SELECT t1.id, t1.created, t1.description, t2.title,
CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.object_id = t2.id AND t1.object_group = 'com_group'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id
ORDER BY t1.id DESC LIMIT 3;

Не стесняйтесь - показывайте реальные названия таблиц и колонок

Так проще понять и связи и остальное

Потому что первый вообще какой-то "левый"


SELECT t1.id, t1.created, t1.description, t2.title,
CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table1 AS t1
INNER JOIN table2 AS t2 ON t1.object_id = t2.id AND t1.object_group = 'com_group'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id
ORDER BY t1.id DESC LIMIT 3;

за счет

INNER JOIN table2 AS t2 ON t1.object_id = t2.id AND t1.object_group = 'com_group'

ЗАчем? если t1.object_group не в видимости t2

Может Вам нужен


SELECT t1.id, t1.created, t1.description, t2.title,
CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table1 AS t1
INNER JOIN table2 AS t2 ON t1.object_id = t2.id'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id
WHERE t1.object_group = 'com_group
ORDER BY t1.id DESC LIMIT 3;


---------- Добавлено 23.09.2017 в 12:53 ----------

LEOnidUKG, Но это никак не объясняет разницы в быстродействии
danforth
На сайте с 18.12.2015
Offline
153
#3

Дайте угадаю, таблица table2 у вас маленькая?

INNER JOIN обычно быстрее LEFT JOIN, у вас либо не хватает индексов либо хз что. То что вам тут дали картинку, это хорошо, но это не объясняет такого поведения. По картинке, кстати, ясно, что INNER JOIN абсолютно не эквивалент LEFT JOIN.

P.S. Пока писал, появился пост выше, почти такой-же.

Junior Web Developer
D
На сайте с 28.06.2008
Offline
1101
#4
danforth:
Дайте угадаю, таблица table2 у вас маленькая?.

table1 самая большая - более 300.000 записей

table2 - примерно 25000

остальные мизер. На всех полях что участвуют в объединении есть индексы. Результат запроса одинаков абсолютли

---------- Добавлено 23.09.2017 в 13:04 ----------

Chukcha:
Потому что первый вообще какой-то "левый"....
Может Вам нужен...

Попробовал ваш запрос - результат тот же - время выполнения 4,4 сек. т.е. дольше всех

danforth
На сайте с 18.12.2015
Offline
153
#5

Загрузите на SQL Fiddle схемы, можно будет подумать как оптимизировать.

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#6
Chukcha:
LEOnidUKG, Но это никак не объясняет разницы в быстродействии

Я привёл информацию, что это разные инструменты и результаты будут разные. Просто так заменить слова и радоваться не получится.

Я вообще стараюсь избегать таких запросов, лучше несколько простых и перебор, чем вот такие конструкции и потом ищи гадай, что и зачем, почему это сжирает память и ещё по 4-6 секунд выполняется.

C
На сайте с 04.02.2005
Offline
277
#7

тут можно экспериментировать сколько угодно

SELECT t1.id, t1.created, t1.description, t2.title,

CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table1 AS t1
INNER JOIN table2 AS t2 ON t1.object_id = t2.id'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id
WHERE t1.object_group = 'com_group
ORDER BY t1.id DESC LIMIT 3;

Например меняем порядок таблиц

SELECT t1.id, t1.created, t1.description, t2.title,

CONCAT_WS('-', t2.id, t2.alias) AS item_alias,
CONCAT_WS('-', t3.id, t3.alias) AS category_alias,
CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM table2 AS t2
INNER JOIN table1 AS t1 ON t2.object_id = t1.id' AND t1.object_group = 'com_group'
LEFT JOIN table3 AS t3 ON t2.category_id = t3.id
LEFT JOIN table4 AS t4 ON t2.section_id = t4.id

ORDER BY t1.id DESC LIMIT 3;


---------- Добавлено 23.09.2017 в 13:16 ----------

LEOnidUKG:
Я привёл информацию, что это разные инструменты и результаты будут разные. Просто так заменить слова и радоваться не получится.

Я вообще стараюсь избегать таких запросов, лучше несколько простых и перебор, чем вот такие конструкции и потом ищи гадай, что и зачем, почему это сжирает память и ещё по 4-6 секунд выполняется.

Та нормальный запрос, То вы, наверное не видели джойнов по 10 таблиц, и вложенных запросов.

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#8

Может ещё вместо INNER сделать подзапрос SELECT, думаю будет быстрее.

D
На сайте с 28.06.2008
Offline
1101
#9
Chukcha:
Например меняем порядок таблиц

Неизвестный столбец 't2.object_id' в 'on clause'

C
На сайте с 04.02.2005
Offline
277
#10

FROM table1 AS t1

INNER JOIN table2 AS t2 ON t1.object_id = t2.id'

FROM table2 AS t2

INNER JOIN table1 AS t1 ON t1.object_id = t2.id' AND t1.object_group = 'com_group'

Мабуть так

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий