powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать запрос без подзапроса
25 сообщений из 25, страница 1 из 1
Можно ли сделать запрос без подзапроса
    #39115567
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день уважаемые!

У меня вопрос по реализации запроса.
Есть две таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
table1 (
   id      INT UNSIGNED NOT NULL PRIMARY KEY,
   data  CHAR(5)
)

table2 (
   id          INT UNSIGNED NOT NULL PRIMARY KEY,
   tab1ID   INT UNSIGNED NOT NULL UNIQUE,
   FOREIGN KEY tab1ID REFERENCES table1(1) ON DELETE CASCADE ON UPDATE CASCADE
)


Соответственно во второй таблице содержатся ключи из первой таблицы, например те которые добавлены в корзину.
Мне надо выбрать все элементы из первой таблице которых нет во второй:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT aa.id /*0*/, aa.data /*1*/ 
FROM  table1 AS aa 
WHERE aa.id NOT IN (
    SELECT bb.tab1ID 
    FROM    table2  AS bb
)


Так вот вопрос в том, оптимален ли такой запрос с вложеным подзапросом или может есть более оптимальный вариант?
Просто читал что вложенные запросы это в общем плохой вариант и если можно без них, то лучше без них.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39115568
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатался немного:
Код: sql
1.
2.
...
FOREIGN KEY tab1ID REFERENCES table1(id) ON DELETE CASCADE ON UPDATE CASCADE
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39115655
Гуляев Гоша,

left join anti
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39115665
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх , я погуглил left join anti mysql и если честно не нашёл ничего кроме описания самого left join.
А anti выдаёт только для Oracle, PostgreSQL и майкрософтовые ссылки.

Мне надо под MySQL решение.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39115677
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Гуляев Гоша]Добрый день уважаемые!
:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT aa.id /*0*/, aa.data /*1*/ 
FROM  table1 AS aa 
WHERE aa.id NOT IN (
    SELECT bb.tab1ID 
    FROM    table2  AS bb
)


Так вот вопрос в том, оптимален ли такой запрос с вложеным подзапросом

оптимально


или может есть более оптимальный вариант?


нет

Просто читал что вложенные запросы это в общем плохой вариант и если можно без них, то лучше без них.

не читай бред в интернете...
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39115724
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев Гошая погуглил left join anti mysql и если честно не нашёл ничего кроме описания самого left join.
Ну дык описание LEFT JOIN почитай, да... ну чтобы работа гугла зря не пропадала.

Гуляев Гошавопрос в том, оптимален ли такой запрос с вложеным подзапросом или может есть более оптимальный вариант?
Такой запрос на такой задаче и такой структуре - скорее свидетельство профнепригодности программиста, чем что-либо ещё.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39115895
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaГуляев Гошая погуглил left join anti mysql и если честно не нашёл ничего кроме описания самого left join.
Ну дык описание LEFT JOIN почитай, да... ну чтобы работа гугла зря не пропадала.

Гуляев Гошавопрос в том, оптимален ли такой запрос с вложеным подзапросом или может есть более оптимальный вариант?
Такой запрос на такой задаче и такой структуре - скорее свидетельство профнепригодности программиста, чем что-либо ещё.

и что ж тебе не нравится?
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39116016
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivи что ж тебе не нравится?Отсутствием гарантии, что подзапрос будет выполнен один раз. Невозможностью использования FK-индекса таблицы table2.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39116030
Гуляев Гоша Добрый Э - Эх , я погуглил left join anti mysql и если честно не нашёл ничего кроме описания самого left join.
А anti выдаёт только для Oracle, PostgreSQL и майкрософтовые ссылки.

Мне надо под MySQL решение.

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT aa.id /*0*/, aa.data /*1*/ 
  FROM  table1 AS aa 
-- обещанный LEFT JOIN:
  LEFT JOIN table2 AS bb
    on aa.id = bb.tab1ID
-- а это реализация "ANTI":
 WHERE bb.tab1ID is null
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39116426
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMasterZivи что ж тебе не нравится?Отсутствием гарантии, что подзапрос будет выполнен один раз. Невозможностью использования FK-индекса таблицы table2.

И с чего ты пришёл к такому выводу ?
Может у тебя есть какие-то логические доводы ?
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39116433
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что тут может требовать логических доводов? Что именно не кажется очевидным?
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39116440
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЧто тут может требовать логических доводов? Что именно не кажется очевидным?

Отсутствием гарантии, что подзапрос будет выполнен один раз.

Невозможностью использования FK-индекса таблицы table2.

Мне совсем неочевидны эти утверждения.
К тому же, не совсем очевидно, что гарантия выполнения поздапроса один раз автоматом даст наилучшее время выполнения этого запроса.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39116664
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пункт 1. Чтобы подзапрос выполнился один раз, сервер должен либо не разрешать коррелированных подзапросов вообще, либо уметь понять, что подзапрос не коррелированный. Без указания конкретной версии сервера убеждённости в том, что он поймёт правильно и выполнит подзапрос один раз - нет и быть не может.

Пункт 2. После выполнения подзапроса мы получим тот дже набор записей, что и в таблице 2, но неиндексированный. Следовательно, индекса, который может использоваться, просто не существует.

Странно, что надо разжёвывать такие элементарные вещи.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39117204
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПункт 1. Чтобы подзапрос выполнился один раз, сервер должен либо не разрешать коррелированных подзапросов вообще, либо уметь понять, что подзапрос не коррелированный. Без указания конкретной версии сервера убеждённости в том, что он поймёт правильно и выполнит подзапрос один раз - нет и быть не может.

Пункт 2. После выполнения подзапроса мы получим тот дже набор записей, что и в таблице 2, но неиндексированный. Следовательно, индекса, который может использоваться, просто не существует.

Странно, что надо разжёвывать такие элементарные вещи.
сейчас некогда писать, но кратко - все домыслы...
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39117265
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAkinaПункт 1. Чтобы подзапрос выполнился один раз, сервер должен либо не разрешать коррелированных подзапросов вообще, либо уметь понять, что подзапрос не коррелированный. Без указания конкретной версии сервера убеждённости в том, что он поймёт правильно и выполнит подзапрос один раз - нет и быть не может.

Пункт 2. После выполнения подзапроса мы получим тот дже набор записей, что и в таблице 2, но неиндексированный. Следовательно, индекса, который может использоваться, просто не существует.

Странно, что надо разжёвывать такие элементарные вещи.
сейчас некогда писать, но кратко - все домыслы...ну пункт 1 точно не домысел
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39117274
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivсейчас некогда писать, но кратко - все домыслы...
Ох ты ж блин же ж... уж сразу написал бы "все знают, что это домыслы" - и спору конец.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120081
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMasterZivсейчас некогда писать, но кратко - все домыслы...
Ох ты ж блин же ж... уж сразу написал бы "все знают, что это домыслы" - и спору конец.

t4 = таблица с 999 интегерами

т1 -- таблица с милионом записей (точнее 998001)

Код: sql
1.
2.
3.
insert into t1
select b1.y + b2.y*1000 a, MD5(b1.y + b2.y*1000) b
from t4 b1, t4 b2 -- картезиан 1000*1000



т2 -- вторая таблица в изначальной задаче.
по условию rand() > 0.х заполняется часть милиона.

Код: sql
1.
2.
3.
4.
insert into t2
select b1.y + b2.y*1000 a, MD5(b1.y + b2.y*1000) b
from t4 b1, t4 b2
where rand() > 0.9 -- 0.7,0.5,0.3,0.1



два тестовых СКЛ-а, первый НОТ ИН, второй ЛЕФТ АНТИ ЖОИНТ.
Ниже везде порядок сохраняется:

Код: sql
1.
2.
3.
4.
5.
6.
select count(1) from (
select t1.*
from t1
where t1.id not in 
(select t2.idt2 
from t2)) g



Код: sql
1.
2.
3.
4.
5.
select count(1) from (
select t1.*
from t1
left join  t2 on t1.id = t2.idt2 
where t2.idt2 is null) g



t2 = 8168 rows
r1 = 0.469, 0.453,
1 PRIMARY t1 index PRIMARY 4 994548 100.00 Using where; Using index3 SUBQUERY t2 index PRIMARY PRIMARY 4 10424 100.00 Using index
r2 = 1.343, 1.328
1 SIMPLE t1 index PRIMARY 4 994548 100.00 Using index1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.id 1 100.00 Using where; Not exists; Using index
t2 = 96843
r1 = 0.547, 0.547
1 PRIMARY t1 index PRIMARY 4 994548 100.00 Using where; Using index3 SUBQUERY t2 index PRIMARY PRIMARY 4 91839 100.00 Using index
r2 = 1.375. 1.391
1 SIMPLE t1 index PRIMARY 4 994548 100.00 Using index1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.id 1 100.00 Using where; Not exists; Using index
t2 = 245979,
r1 = 0.687, 0.688
1 PRIMARY t1 index PRIMARY 4 994548 100.00 Using where; Using index3 SUBQUERY t2 index PRIMARY PRIMARY 4 245002 100.00 Using index
r2 = 1.422, 1.438
1 SIMPLE t1 index PRIMARY 4 994548 100.00 Using index1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.id 1 100.00 Using where; Not exists; Using index
t2 = 482868
r1 = 2.125, 1.937
1 PRIMARY t1 index PRIMARY 4 994548 100.00 Using where; Using index3 SUBQUERY t2 index PRIMARY PRIMARY 4 486675 100.00 Using index
r2 = 1.484, 1.485,
1 SIMPLE t1 index PRIMARY 4 994548 100.00 Using index1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.id 1 100.00 Using where; Not exists; Using index
t2 = 806773
run1 = 2.375, 2.390
1 PRIMARY t1 index PRIMARY 4 994548 100.00 Using where; Using index3 SUBQUERY t2 index PRIMARY PRIMARY 4 805950 100.00 Using index
run2 = 1.516, 1.516
1 SIMPLE t1 index PRIMARY 4 994548 100.00 Using index1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.id 1 100.00 Using where; Not exists; Using index
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120084
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...сводную таблицу лень составлять.

Короче лефт антижоинт постояно 1.3-1.5 сек.

НОТ ИН показывает 0.4-0.6 сек
в 2-3 раза быстрее когда вторая таблица
ниже 25% от первой.

При заполнении больше 50% НОТ ИН показывает 2.1-2.3 сек.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120085
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного смешно, что експлаин показывает
"Not exists" для левого антижоинта и НЕ показывает
это для NOT IN.

(mysql 5.7, windows 10 , i7-4970, 16G, EVO 850 pro SSD)
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120088
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну типа, что б закруглить доклад:
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE `t1` (
   `id` int(11) NOT NULL,
   `dat` varchar(45) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8


Код: sql
1.
2.
3.
4.
CREATE TABLE `t2` (
   `idt2` int(11) NOT NULL,
   PRIMARY KEY (`idt2`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120105
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

mysql 5.7 зло )
Windows 10 еще из космоса )) (и кстати как она? для разработчика гладкий переход?)
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120483
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovjavajdbc,

mysql 5.7 зло )


Раскрой, пожалуйста, тему. Можно в отдельном топике.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120803
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov >> mysql 5.7 зло )

...не в курсе, какой последний дают скачать, такой и установил вчера..

>> Windows 10 еще из космоса )) (и кстати как она? для разработчика гладкий переход?)

самам по себе 10-ка -- в полне стабильная, пользую по дому
на нескольких компах уже больше года -- ни одного разрыва.
Встает легко на железо до 7-10 лет.
Насчет разработки -- все что работало в весьмерке -- вполне
фурычит на десятке... всякие висуал студии, еклипсы, ораклы, мыскл, скл серверы...

Это дома, а на работе допотопные вин7/сервер2012 и Федора 19 :-)
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120962
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

первое столкновение оказалось неудачным... при создании индекса по полю varchar(50) в совершенно голой базе он оказался бракованным, причем в MariaDB10.1(сто`ит на 5.7) тоже самое. ХДД-Диски новые. Потерял кучу времени. Вот теперь мое такое мнение.
...
Рейтинг: 0 / 0
Можно ли сделать запрос без подзапроса
    #39120971
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

спасибо, я тяжело переходил на Win7, на Вин8 не пошел из-за Метро, хотя есть КлассикШелл и прочее, не увидел смысла, а теперь выскакивает назойливо переход на Win10, а что так назойливо - вызывает дикое отвращение... как стадо перегоняют...
на работе есть еще экземпляры и с ХР, с древним софтом...а дома Бубунту+Вин7...
а если я на работе поставлю Вин10 - все отделы встанут )
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать запрос без подзапроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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