SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 17.02.2012 05:14:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Как mysql осуществляет join

http://dev.mysql.com/doc/refman/5.5/en/ … utput.html

MySQL resolves all joins using a nested-loop join method. This means that MySQL reads a row from the first table, and then finds a matching row in the second table, the third table, and so on. When all tables are processed, MySQL outputs the selected columns and backtracks through the table list until a table is found for which there are more matching rows. The next row is read from this table and the process continues with the next table.

Проверяю:

 create table t1(id int,val int);
 create table t2(id int,val int);
 create table t3(id int,val int);

 insert into t1 values(1,5),(2,5);
 insert into t2 values(11,5),(12,5);
 insert into t3 values(21,5),(22,5);

 select t1.id,t2.id,t3.id from t1 join t2 on t1.val=t2.val join t3 on t2.v
al=t3.val;
+------+------+------+
| id   | id   | id   |
+------+------+------+
|    1 |   11 |   21 |
|    2 |   11 |   21 |
|    1 |   12 |   21 |
|    2 |   12 |   21 |
|    1 |   11 |   22 |
|    2 |   11 |   22 |
|    1 |   12 |   22 |
|    2 |   12 |   22 |
+------+------+------+
8 rows in set (0.05 sec)

Однако, согласно написанному в доке, ожидаю получить выборку вида
1,11,21
1,11,22
1,12,21
...
2,12,22

Неактивен

 

#2 17.02.2012 06:05:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как mysql осуществляет join

Разобрался. В данном случае используется join buffer, в который помещается сначала первая таблица, а потом результат объединения первой и второй.
Если добавить индексы на val, чтобы избежать использования join buffer, то выборка принимает ожидаемый вид

mysql> select t1.id,t2.id,t3.id from t1 join t2 on t1.val=t2.val join t3 on t2.v
al=t3.val;
+----+----+----+
| id | id | id |
+----+----+----+
|  1 | 11 | 21 |
|  1 | 11 | 22 |
|  1 | 12 | 21 |
|  1 | 12 | 22 |
|  2 | 11 | 21 |
|  2 | 11 | 22 |
|  2 | 12 | 21 |
|  2 | 12 | 22 |
+----+----+----+

Неактивен

 

Board footer

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