Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать запрос без подзапроса / 25 сообщений из 25, страница 1 из 1
29.11.2015, 07:05:28
    #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
29.11.2015, 07:11:12
    #39115568
Гуляев Гоша
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
Опечатался немного:
Код: sql
1.
2.
...
FOREIGN KEY tab1ID REFERENCES table1(id) ON DELETE CASCADE ON UPDATE CASCADE
...
Рейтинг: 0 / 0
29.11.2015, 14:48:09
    #39115655
Можно ли сделать запрос без подзапроса
Гуляев Гоша,

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

Мне надо под MySQL решение.
...
Рейтинг: 0 / 0
29.11.2015, 15:50:49
    #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
29.11.2015, 17:22:14
    #39115724
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
Гуляев Гошая погуглил left join anti mysql и если честно не нашёл ничего кроме описания самого left join.
Ну дык описание LEFT JOIN почитай, да... ну чтобы работа гугла зря не пропадала.

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

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

и что ж тебе не нравится?
...
Рейтинг: 0 / 0
30.11.2015, 09:17:12
    #39116016
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
MasterZivи что ж тебе не нравится?Отсутствием гарантии, что подзапрос будет выполнен один раз. Невозможностью использования FK-индекса таблицы table2.
...
Рейтинг: 0 / 0
30.11.2015, 09:27:37
    #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
30.11.2015, 15:34:02
    #39116426
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
AkinaMasterZivи что ж тебе не нравится?Отсутствием гарантии, что подзапрос будет выполнен один раз. Невозможностью использования FK-индекса таблицы table2.

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

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

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

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

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

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

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

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

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

Странно, что надо разжёвывать такие элементарные вещи.
сейчас некогда писать, но кратко - все домыслы...ну пункт 1 точно не домысел
...
Рейтинг: 0 / 0
01.12.2015, 13:12:20
    #39117274
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
MasterZivсейчас некогда писать, но кратко - все домыслы...
Ох ты ж блин же ж... уж сразу написал бы "все знают, что это домыслы" - и спору конец.
...
Рейтинг: 0 / 0
04.12.2015, 07:23:28
    #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
04.12.2015, 07:30:47
    #39120084
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
...сводную таблицу лень составлять.

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

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

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

(mysql 5.7, windows 10 , i7-4970, 16G, EVO 850 pro SSD)
...
Рейтинг: 0 / 0
04.12.2015, 07:38:35
    #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
04.12.2015, 08:31:22
    #39120105
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать запрос без подзапроса
javajdbc,

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

mysql 5.7 зло )


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

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

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

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

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

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

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


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