powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Каой из запросов более правильный (оптимальный)?
18 сообщений из 18, страница 1 из 1
Каой из запросов более правильный (оптимальный)?
    #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
Каой из запросов более правильный (оптимальный)?
    #38875037
Ch_sla,

А ничего, что эти запросы семантически неэквивалентны и в общем случае возвращают совершенно разные резульутаты?
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #38875060
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй запрос вырожден и на самом деле INNER JOIN.
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #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
Каой из запросов более правильный (оптимальный)?
    #38875084
Ch_slaВозвращают, на реальной базе, одно и тоже.тебе просто повезло...
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #38875087
Ch_slaЕсли inner join, то какой из них?с вероятностью в 99% можно сказать - что без разницы. но 146% можно будет дать, лишь покурив планы запросов.
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #38875106
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ch_slaДобрый Э - ЭхCh_sla,

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


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

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

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


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

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

они на любой базе возвращают совершенно разное.
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #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
Каой из запросов более правильный (оптимальный)?
    #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
Каой из запросов более правильный (оптимальный)?
    #38875334
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ch_sla,

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

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

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

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

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

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

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

Если по поводу условия, то в левом соединении первый запрос может обеспечить уменьшение поиска записей. Но только в левом.
В чем кривость?
Не указаны поля? А это очень существенно для вопроса? Или оптимальность заключается в том, что указав выбираемые поля, и запрос станет более оптимальным?
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #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
Каой из запросов более правильный (оптимальный)?
    #38876080
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ch_sla,

Ну как-бы да. Селект * - есть плохо и неоптимально по определению. И при широких табличках - часто является главным тормозом выборки. Зачастую этого вполне достаточно чтобы запрос стал "неоптимальным". :)
...
Рейтинг: 0 / 0
Каой из запросов более правильный (оптимальный)?
    #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
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Каой из запросов более правильный (оптимальный)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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