Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нагрузка подзапросов 
V
    Опции темы
Acuna
Дата 18.6.2013, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2013

Репутация: нет
Всего: нет



Всем добрый день!

Есть запрос вида

Код
SELECT * FROM `table` WHERE `id` IN (SELECT `post_id` FROM `table2` WHERE `user_id` = "2");

Подзапрос из таблицы table2 может вывести около 10 000 строк (в общем, много). Загнется ли сервер, и можно ли реализовать данную задачу каким-либо другим способом? По сути, мне нужно вывести все строки из таблицы table с id равным значению post_id юзера с user_id = 2.

Заранее благодарен!

Это сообщение отредактировал(а) Acuna - 18.6.2013, 02:48
PM MAIL   Вверх
Arantir
Дата 18.6.2013, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Наверное, как-то так:
Код

SELECT * FROM `table` INNER JOIN `table2` ON `table`.`id`=`table2`.`post_id` WHERE `table2`.`user_id` = "2"


В общем, для выбора пресечения значений двух таблиц (например, с одинаковым `id` и `post_id`) лучше использовать JOIN. Он как раз для этого и работает куда быстрее. Особенно, если 
Цитата

вывести около 10 000 строк
.

Это сообщение отредактировал(а) Arantir - 18.6.2013, 05:27


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Akina
Дата 18.6.2013, 08:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Как по мне, так более понятна форма

Код

SELECT t1.* 
FROM `table`, `table2` 
WHERE `table`.`id`=`table2`.`post_id` 
AND `table2`.`user_id` = "2"


Arantir, Ваш вариант неэквивалентен исходному запросу, ибо даёт иной набор полей выходного набора.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Arantir
Дата 18.6.2013, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Цитата(Akina @  18.6.2013,  07:03 Найти цитируемый пост)
Arantir, Ваш вариант неэквивалентен исходному запросу, ибо даёт иной набор полей выходного набора. 

Пф...
Код
SELECT `table`.* FROM `table` INNER JOIN `table2` ON `table`.`id`=`table2`.`post_id` WHERE `table2`.`user_id` = "2"


Конкретная реализация стоит денег, а бесплатно - только идеи и намеки. На то он и форум  smile 

Под выборкой из нескольких таблиц все равно скрывается неявный JOIN.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Akina
Дата 18.6.2013, 08:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Arantir @  18.6.2013,  09:17 Найти цитируемый пост)
Под выборкой из нескольких таблиц все равно скрывается неявный JOIN. 

Сильно зависит от сервера БД и даже от версии.
Например, на достаточно старых версиях (скажем, MySQL 3.х версии) модификация Вашего запроса в 

Код

SELECT `table`.* 
FROM `table` 
INNER JOIN `table2` 
ON (`table`.`id`=`table2`.`post_id` AND `table2`.`user_id` = "2")


при наличии определённой комбинации индексов может дать изрядный профит...

На современных же серверах все запросы (кроме исходного) дадут абсолютно одинаковый план выполнения.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Arantir
Дата 18.6.2013, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Цитата(Akina @  18.6.2013,  07:41 Найти цитируемый пост)
На современных же серверах все запросы (кроме исходного) дадут абсолютно одинаковый план выполнения. 
Угу. Просто мне показалось, что вариант с JOIN как-то более наглядный. 


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Akina
Дата 18.6.2013, 09:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Arantir @  18.6.2013,  10:25 Найти цитируемый пост)
вариант с JOIN как-то более наглядный

Он изрядно путает (особенно начинающих) некоторыми неявными фортелями с NULL...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 18.6.2013, 10:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  18.6.2013,  09:03 Найти цитируемый пост)
неэквивалентен исходному запросу, ибо даёт иной набор полей выходного набора. 

Не только в этом. 
Если уж быть педантичным, то, хоть и очевидно, что поле с названием id должно быть уникальным, но пока об этом нигде не написано - ожидать что полусоединение (semi-join) будет эквивалентно вунтреннему - нельзя smile

Цитата(Akina @  18.6.2013,  10:28 Найти цитируемый пост)
некоторыми неявными фортелями с NULL... 

Это какие, к примеру? Здесь же inner, здесь пофиг, в on вставлять предикат или же в where. Главное оптимизатор не запутать.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 18.6.2013, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Zloxa @  18.6.2013,  11:31 Найти цитируемый пост)
Это какие, к примеру? Здесь же inner, здесь пофиг

Ну фраза была про джойн вообще...

Цитата(Zloxa @  18.6.2013,  11:31 Найти цитируемый пост)
хоть и очевидно, что поле с названием id должно быть уникальным, но пока об этом нигде не написано - ожидать что полусоединение (semi-join) будет эквивалентно вунтреннему - нельзя

То да, по-хорошему там дистинкта нехватает.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 18.6.2013, 10:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  18.6.2013,  11:37 Найти цитируемый пост)
То да, по-хорошему там дистинкта нехватает. 

Дистинкт не поможет нам добиться эквивалентности, если id  не PK  smile Я ж о том и толкую. Если бы было четко сказано, что id это ПК, я б не умничал, а сразу на недостаток distinct указал бы. Ну... и есесно, это в контексте архипедантичности было все. ;)


Ну и елси по теме, исходный запрос можно попробовать переформулировать на exists.  Может статься, что план будет трошку получше.

Это сообщение отредактировал(а) Zloxa - 18.6.2013, 10:54


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Acuna
Дата 18.6.2013, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 18.6.2013

Репутация: нет
Всего: нет



Akina, О! Не знал, что в FROM можно указать несколько таблиц. Интересная идея.

Zloxa, да, радует, что id уникальный, DISTINCT не нужен...

P. S. Мда, все-таки пока, к сожалению так, как нужно, работает только с подзапросом :(

Это сообщение отредактировал(а) Acuna - 18.6.2013, 19:52
PM MAIL   Вверх
SilverSoft
Дата 18.6.2013, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.8.2011

Репутация: нет
Всего: нет



джоины - зло, они сильно усложняют работу при масштабировании проекта ) в том же facebook нет не одного джоина)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Zloxa
Дата 18.6.2013, 20:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Acuna @  18.6.2013,  20:42 Найти цитируемый пост)
id уникальный, DISTINCT не нужен...

Дистинкт не нужен если table2.post_id уникален.

А относительно id речь была о том, что если он не уникален, то distinct не поможет

Добавлено через 57 секунд
Цитата(SilverSoft @  18.6.2013,  20:57 Найти цитируемый пост)
джоины - зло

Кислород - зло. В результате окислительных процессов человеческий организм стареет  smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 19.6.2013, 07:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(SilverSoft @  18.6.2013,  20:57 Найти цитируемый пост)
джоины - зло, они сильно усложняют работу при масштабировании проекта 

ну да ну да... а всякие там WHERE t1.id=t2.id OR t2.id IS NULL - это самое что ни на есть добро...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 19.6.2013, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  19.6.2013,  08:53 Найти цитируемый пост)
а всякие там

Это ш тоже джойн.
Товарищ явно начитался статей о носкуэль и проникся.

Цитата(Akina @  19.6.2013,  08:53 Найти цитируемый пост)
OR t2.id IS NULL

Это ты так аутер в виду поимел? Не будет же так работать. Это ведь преджойн предикат. Для постжойн предикатов придуманы кастыли вроде
 '(+)', '*=','=*' 

Это сообщение отредактировал(а) Zloxa - 19.6.2013, 09:17


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0979 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.