MySQL: Сколько строк таблицы сканируется в JOIN? - PullRequest
0 голосов
/ 29 марта 2020

Если у меня есть три таблицы, каждая из которых имеет 1000 строк с номерами от 1 до 1000, то сколько сравнений делает MySQL во время следующих JOIN s запросов:

SELECT *
FROM table_1 t1 
JOIN table_2 t2 ON t1.id_1 = t2.id_2
JOIN table_3 t3 ON t2.id_2 = t3.id_3;

и

SELECT *
FROM table_1 t1 
JOIN table_2 t2 
JOIN table_3 t3
WHERE t1.id_1 = t2.id_2 AND t2.id_2 = t3.id_3;

Обратите внимание, что ни в одной из таблиц нет индексов. Есть ли разница между двумя запросами? Я думаю, что во втором запросе он написан с намерением, чтобы MySQL создавал декартово произведение всех трех таблиц, а затем отфильтровывал строки, соответствующие условию (необходимо отсканировать 1000 X 1000 X 1000 строк), но внутренне он преобразуется в первый запрос, в котором он будет сканировать 1000 X 1000 строк в первом JOIN, а затем еще 1000 X 1000 строк во втором JOIN. Результат должен быть одинаковым (1000 строк с тремя столбцами имеют одинаковое число от 1 до 1000).

Какой это? 1000 X 1000 X 1000 строк ИЛИ 1000 X 1000 + 1000 X 1000 строк

Вопрос возник после прочтения следующего из главы «Оптимизация запросов» из MySQL Пола Дюбуа (4-е издание, стр. 306) :

enter image description here

1 Ответ

0 голосов
/ 29 марта 2020

Эти два запроса обрабатываются одинаково.

Для ясность , ON должно указывать, как связаны таблицы; WHERE должен фильтровать.

Но для оптимизации они эквивалентны JOIN.

FO LEFT JOIN, делает независимо от того, где вы поставили условия.

В качестве дополнительной складки к вашему вопросу ... Если бы в таблицах было разное количество строк, оптимизатор, вероятно, начал бы с самой маленькой таблицы.

См. это, чтобы узнать, как считать строки: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#handler_counts

Пожалуйста, укажите SHOW CREATE TABLE, чтобы мы могли понять id_1, et c.

It было бы глупо sh запускать такой код без индексов.

Каков ожидаемый результат? Как то так?

+---+---+---+
| n | n | n |
+---+---+---+
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...