SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.02.2012 23:18:27

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

INNER JOIN, по какому принципу выбирается основная таблица ?

INNER JOIN в отличие от STRAIGHT_JOIN, автоматически выбирает основную таблицу.
В практике встречались случаи, когда таблица выбиралась неправильная.
Вопрос, по какому принципу выбирается основная таблица ?

Неактивен

 

#2 01.02.2012 23:22:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

Сравнивается оценка времени исполнения для обоих вариантов. Есть ряд случаев, когда оценка оказывается неправильной, но нужно учитывать, что план может зависеть от числа записей в таблице и от параметров запроса. Поэтому замена на STRAIGHT_JOIN не всегда эффективна.

Неактивен

 

#3 02.02.2012 02:02:56

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

rgbeast написал:

Сравнивается оценка времени исполнения для обоих вариантов. Есть ряд случаев, когда оценка оказывается неправильной, но нужно учитывать, что план может зависеть от числа записей в таблице и от параметров запроса. Поэтому замена на STRAIGHT_JOIN не всегда эффективна.

Да, логично ... Но в тех запросах которые я встречал, число записей как раз было обратным.
То есть 

SELECT * FROM table1 JOIN table2 ON(table1=table2)

В table2 больше записей, и всё таки mysql предпочёл сделать fullscan по ней.
Интересно именно по какому критерию он делает свой выбор. Не нашёл никаких материалов на эту тему.

Неактивен

 

#4 02.02.2012 02:05:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

Женя, а были условия WHERE в запросе? Были ли индексы на тех полях, по которым связка проводилась? Ты бы приложил таблички сами smile, я недавно тоже на похожее натыкался.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 02.02.2012 03:02:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

Приведите EXPLAIN двух запросов с разным порядком STRAIGHT_JOIN и одного с INNER JOIN. Возможно есть какие-то причины, связанные с индексами или число записей незначительное. Баги на эту тему тоже бывают.

Неактивен

 

#6 02.02.2012 16:52:45

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

Запрос банален ... никаких WHERE, индекс с двух сторон на полях соединения.
Сейчас воспроизвести не получается. Неправильное соединение зависит чисто от содержимого таблицы.
Просто думал, может есть где то опубликованный алгоритм автоматического выбора.
Хотя чисто теоретически сторону можно всегда выбирать по количеству записей в таблице.
Я ещё поиграюсь, может получиться воспроизвести ...

Неактивен

 

#7 02.02.2012 17:35:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

Алгоритм нигде не опубликован в деталях (до чисел). В MariaDB, по заявлению разработчиков, алгоритмы оптимизации переделаны на более правильные - интересно это проверить.

Неактивен

 

#8 02.02.2012 19:11:52

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: INNER JOIN, по какому принципу выбирается основная таблица ?

К слову, имеет еще смысл поэксперементировать с количеством выбираемых полей из разных таблиц (особенно если имеется сортировка) - от этого план, похоже, тоже иногда зависит.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson