Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Каой из запросов более правильный (оптимальный)? / 18 сообщений из 18, страница 1 из 1
09.02.2015, 16:59:56
    #38875003
Ch_sla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Код: sql
1.
2.
3.
SELECT *
FROM product 
LEFT JOIN product_descrp pd ON (p.product_id = pd.product_id AND pd.language_id = 1)



или

Код: sql
1.
2.
3.
4.
SELECT *
FROM product 
LEFT JOIN product_descrp pd on(p.product_id = pd.product_id)
WHERE pd.language_id = 1
...
Рейтинг: 0 / 0
09.02.2015, 17:35:49
    #38875037
Каой из запросов более правильный (оптимальный)?
Ch_sla,

А ничего, что эти запросы семантически неэквивалентны и в общем случае возвращают совершенно разные резульутаты?
...
Рейтинг: 0 / 0
09.02.2015, 17:48:30
    #38875060
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Второй запрос вырожден и на самом деле INNER JOIN.
...
Рейтинг: 0 / 0
09.02.2015, 18:06:31
    #38875076
Ch_sla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Добрый Э - ЭхCh_sla,

А ничего, что эти запросы семантически неэквивалентны и в общем случае возвращают совершенно разные резульутаты?
Возвращают, на реальной базе, одно и тоже.



AkinaВторой запрос вырожден и на самом деле INNER JOIN.
Тогда, какой запрос более оптимальный?


Если inner join, то какой из них?

Код: sql
1.
2.
3.
4.
SELECT *
FROM product 
INNER JOIN product_descrp pd on(p.product_id = pd.product_id)
WHERE pd.language_id = 1



Код: sql
1.
2.
3.
SELECT *
FROM product 
INNER JOIN product_descrp pd on(p.product_id = pd.product_id AND pd.language_id = 1)
...
Рейтинг: 0 / 0
09.02.2015, 18:15:21
    #38875084
Каой из запросов более правильный (оптимальный)?
Ch_slaВозвращают, на реальной базе, одно и тоже.тебе просто повезло...
...
Рейтинг: 0 / 0
09.02.2015, 18:21:38
    #38875087
Каой из запросов более правильный (оптимальный)?
Ch_slaЕсли inner join, то какой из них?с вероятностью в 99% можно сказать - что без разницы. но 146% можно будет дать, лишь покурив планы запросов.
...
Рейтинг: 0 / 0
09.02.2015, 18:37:58
    #38875106
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_slaДобрый Э - ЭхCh_sla,

А ничего, что эти запросы семантически неэквивалентны и в общем случае возвращают совершенно разные резульутаты?
Возвращают, на реальной базе, одно и тоже.


они на любой базе не возвращают совершенно разное.
для этого достаточно взять реальную базу, и ввести нереальное значение pd.language_id = ХХХ
где ХХХ нереальное, несуществующее в базе значение)
...
Рейтинг: 0 / 0
09.02.2015, 18:40:56
    #38875108
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_sla,
да и в запросе пропущен псевдоним для таблицы продукты, он вообще не выполнится в таком виде... похоже запросы сюда не копипастились из клиента/кода.

а ответ на твой плохо поставленный вопрос - первый лучше. ибо умножается не вся таблица, а лишь Н-ая часть таблицы, где Н - число языков в системе твоей
...
Рейтинг: 0 / 0
09.02.2015, 18:41:52
    #38875109
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
alex564657498765453Ch_slaпропущено...

Возвращают, на реальной базе, одно и тоже.


они на любой базе не возвращают совершенно разное.
для этого достаточно взять реальную базу, и ввести нереальное значение pd.language_id = ХХХ
где ХХХ нереальное, несуществующее в базе значение)

ошибочка, имел ввиду -

они на любой базе возвращают совершенно разное.
...
Рейтинг: 0 / 0
09.02.2015, 19:27:34
    #38875142
Ch_sla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
mysql> SELECT count(p.product_id) FROM `product` p
    -> LEFT join product_descr pd ON (p.product_id = pd.product_id AND pd.language_id =15);
+---------------------+
| count(p.product_id) |
+---------------------+
|                1281 |
+---------------------+
С этим понятно 


mysql> SELECT count(p.product_id) FROM `product` p
    -> LEFT join product_descr pd ON (p.product_id = pd.product_id AND pd.language_id =1);
+---------------------+
| count(p.product_id) |
+---------------------+
|                1281 |
+---------------------+
И с этим понятно 

Оба - LEFT JOIN



И тут понятно - если это превращается в INNER JOIN

mysql> SELECT count(p.product_id) FROM `product` p
    -> LEFT join product_descr pd ON (p.product_id = pd.product_id )
    -> WHERE pd.language_id =15;
+---------------------+
| count(p.product_id) |
+---------------------+
|                   0 |
+---------------------+

mysql> SELECT count(p.product_id) FROM `product` p
    -> LEFT join product_descr pd ON (p.product_id = pd.product_id )
    -> WHERE pd.language_id =1;
+---------------------+
| count(p.product_id) |
+---------------------+
|                1281 |
+---------------------+


Так может семантически верно написать
Код: sql
1.
2.
3.
SELECT count(p.product_id) FROM `product` p
INNER JOIN product_descr pd ON (p.product_id = pd.product_id )
WHERE pd.language_id =1;





Тем более, что планы запросов одинаковы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
mysql> EXPLAIN SELECT count( p.product_id )
    -> FROM `product` p
    -> LEFT JOIN product_descr pd ON ( p.product_id = pd.product_id )
    -> WHERE pd.language_id =1;
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                | rows | Extra                    |
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
|  1 | SIMPLE      | pd    | index  | PRIMARY       | PRIMARY | 8       | NULL               | 1281 | Using where; Using index |
|  1 | SIMPLE      | p     | eq_ref | PRIMARY       | PRIMARY | 4       | elit.pd.product_id |    1 | Using index              |
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
2 rows in set (0.00 sec)

mysql> EXPLAIN SELECT count( p.product_id )
    -> FROM `product` p
    -> INNER JOIN product_descr pd ON ( p.product_id = pd.product_id )
    -> WHERE pd.language_id =1;
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                | rows | Extra                    |
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
|  1 | SIMPLE      | pd    | index  | PRIMARY       | PRIMARY | 8       | NULL               | 1281 | Using where; Using index |
|  1 | SIMPLE      | p     | eq_ref | PRIMARY       | PRIMARY | 4       | elit.pd.product_id |    1 | Using index              |
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
2 rows in set (0.00 sec)

mysql> EXPLAIN SELECT count( p.product_id )
    -> FROM `product` p
    -> INNER JOIN product_descr pd ON ( p.product_id = pd.product_id
    -> AND pd.language_id =1 );
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                | rows | Extra                    |
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
|  1 | SIMPLE      | pd    | index  | PRIMARY       | PRIMARY | 8       | NULL               | 1281 | Using where; Using index |
|  1 | SIMPLE      | p     | eq_ref | PRIMARY       | PRIMARY | 4       | elit.pd.product_id |    1 | Using index              |
+----+-------------+-------+--------+---------------+---------+---------+--------------------+------+--------------------------+
2 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
09.02.2015, 21:42:14
    #38875209
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_slaТем более, что планы запросов одинаковы.
Справку читать не пробовал? про то, как ВЫПОЛНЯЮТСЯ запросы? где бы ты не размещал условия в запросе с INNER JOIN - всё равно он будет преобразован в запрос с декартовым произведением и условиями отбора в секции WHERE, т.е. в:

Код: sql
1.
2.
3.
4.
SELECT count(p.product_id) 
FROM `product` p, product_descr pd 
WHERE p.product_id = pd.product_id 
AND pd.language_id =1;
...
Рейтинг: 0 / 0
10.02.2015, 07:48:45
    #38875334
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_sla,

SELECT * - как правило уже кривой запрос "по определению", за исключением некоторых случаев. Поэтому оба запроса - не оптимальны. :)

Если по поводу условия, то в левом соединении первый запрос может обеспечить уменьшение поиска записей. Но только в левом.
...
Рейтинг: 0 / 0
10.02.2015, 07:49:54
    #38875335
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Добрый Э - Эх,

Для Мускуля, он не только не эквивалентны, но ещё и синтаксически неверны. Алиасы требуется писать к КАЖДОЙ таблице. :)
...
Рейтинг: 0 / 0
10.02.2015, 12:45:50
    #38875805
Ch_sla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Arhat109Добрый Э - Эх,

Для Мускуля, он не только не эквивалентны, но ещё и синтаксически неверны. Алиасы требуется писать к КАЖДОЙ таблице. :)

Вы сделали этот вывод по первому сообщению?

А остальное вы не смотрели?
...
Рейтинг: 0 / 0
10.02.2015, 12:48:16
    #38875813
Ch_sla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Arhat109Ch_sla,

SELECT * - как правило уже кривой запрос "по определению", за исключением некоторых случаев. Поэтому оба запроса - не оптимальны. :)

Если по поводу условия, то в левом соединении первый запрос может обеспечить уменьшение поиска записей. Но только в левом.
В чем кривость?
Не указаны поля? А это очень существенно для вопроса? Или оптимальность заключается в том, что указав выбираемые поля, и запрос станет более оптимальным?
...
Рейтинг: 0 / 0
10.02.2015, 13:36:48
    #38875872
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_slaВы сделали этот вывод по первому сообщению?

А остальное вы не смотрели?Я посмотрел.Ch_slaТем более, что планы запросов одинаковы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
mysql> EXPLAIN SELECT count( p.product_id )
    -> FROM `product` p
    -> LEFT JOIN product_descr pd ON ( p.product_id = pd.product_id )
    -> WHERE pd.language_id =1;

<...>

mysql> EXPLAIN SELECT count( p.product_id )
    -> FROM `product` p
    -> INNER JOIN product_descr pd ON ( p.product_id = pd.product_id )
    -> WHERE pd.language_id =1;

<...>

mysql> EXPLAIN SELECT count( p.product_id )
    -> FROM `product` p
    -> INNER JOIN product_descr pd ON ( p.product_id = pd.product_id
    -> AND pd.language_id =1 );
кагбэ первые 2 вообще одинаковы и таки да, совпадают по смыслу с третьим. И все три, естественно, совпадают со вторым запросом из стартпоста (потому что 17240995 ). Но никак не с первым.
...
Рейтинг: 0 / 0
10.02.2015, 16:08:29
    #38876080
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_sla,

Ну как-бы да. Селект * - есть плохо и неоптимально по определению. И при широких табличках - часто является главным тормозом выборки. Зачастую этого вполне достаточно чтобы запрос стал "неоптимальным". :)
...
Рейтинг: 0 / 0
10.02.2015, 20:34:09
    #38876341
NikolayV81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каой из запросов более правильный (оптимальный)?
Ch_sla...

Я так и не понял что вам нужно в результате:
1. Продукт и если есть описание на языке 1 то и оно
2. Продукт у которого есть описание и оно на языке 1.
мне почемуто кажется что продукт вам нужен в любом случае, не зависимо от того есть в к нему описание на нужном языке или нет, и в этом случае ед. вариантом будет:
Код: sql
1.
2.
3.
4.
5.
SELECT <<fields list>>
  FROM product p
    LEFT JOIN product_descrp pd 
      ON ( ( p.product_id = pd.product_id )
       AND ( pd.language_id = 1           ) )
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Каой из запросов более правильный (оптимальный)? / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]