Является ли более эффективным использовать ON или USING или WHERE в MySQL JOIN? - PullRequest
0 голосов
/ 02 июля 2018

Давайте представим, что у меня есть таблицы foo и bar с обоими id в качестве первичных ключей.

Это следующий запрос:

SELECT * 
FROM foo 
JOIN bar
WHERE foo.id = bar.id
AND foo.id = :id

Производит следующие запросы:

SELECT * 
FROM foo 
JOIN bar ON foo.id = bar.id
AND foo.id = :id

Или:

SELECT * 
FROM foo 
JOIN bar USING (id)
AND foo.id = :id

EXPLAINS говорит мне, что все эти запросы являются синонимами, но мне интересно, есть ли крайние случаи при использовании нескольких индексов? Я не нашел явной документации по этому вопросу.

Приложение: EXPLAINS Результаты.

mysql> EXPLAIN
    ->     SELECT *
    ->     FROM foo
    ->     JOIN bar
    ->     WHERE foo.id = bar.id
    -> ;
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref         | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | foo   | NULL       | index  | PRIMARY       | PRIMARY | 4       | NULL        |  100 |   100.00 | Using index |
|  1 | SIMPLE      | bar   | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | test.foo.id |    1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

mysql> EXPLAIN
    ->     SELECT *
    ->     FROM foo
    ->     JOIN bar USING (id)
    -> ;
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref         | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | foo   | NULL       | index  | PRIMARY       | PRIMARY | 4       | NULL        |  100 |   100.00 | Using index |
|  1 | SIMPLE      | bar   | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | test.foo.id |    1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
2 rows in set, 1 warning (0.01 sec)

mysql> EXPLAIN
    ->     SELECT *
    ->     FROM foo
    ->     JOIN bar ON foo.id = bar.id
    -> ;
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref         | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | foo   | NULL       | index  | PRIMARY       | PRIMARY | 4       | NULL        |  100 |   100.00 | Using index |
|  1 | SIMPLE      | bar   | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | test.foo.id |    1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+-------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

1 Ответ

0 голосов
/ 02 июля 2018

1) Для предложения USING необходимо использовать поля, которые существуют в обеих таблицах и имеют одинаковые имена.
Но в пункте ON вы можете получить что-то вроде:

FROM foo JOIN bar ON foo.id = bar.foo_id

2) В случае, когда вам нужно использовать определенный индекс - укажите поля в соответствии с вашим индексом (работает как для using, так и для on).

3) Если вы используете mysql - вы можете использовать или USING либо ON, оба они работают правильно (никто не отклоняет ни одно из этих пунктов).

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