![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
Acuna |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2013 Репутация: нет Всего: нет |
Всем добрый день!
Есть запрос вида
Подзапрос из таблицы table2 может вывести около 10 000 строк (в общем, много). Загнется ли сервер, и можно ли реализовать данную задачу каким-либо другим способом? По сути, мне нужно вывести все строки из таблицы table с id равным значению post_id юзера с user_id = 2. Заранее благодарен! Это сообщение отредактировал(а) Acuna - 18.6.2013, 02:48 |
|||
|
||||
Arantir |
|
||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
Наверное, как-то так:
В общем, для выбора пресечения значений двух таблиц (например, с одинаковым `id` и `post_id`) лучше использовать JOIN. Он как раз для этого и работает куда быстрее. Особенно, если
Это сообщение отредактировал(а) Arantir - 18.6.2013, 05:27 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Как по мне, так более понятна форма
Arantir, Ваш вариант неэквивалентен исходному запросу, ибо даёт иной набор полей выходного набора. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Arantir |
|
||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
Пф...
Конкретная реализация стоит денег, а бесплатно - только идеи и намеки. На то он и форум ![]() Под выборкой из нескольких таблиц все равно скрывается неявный JOIN. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
Akina |
|
||||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Сильно зависит от сервера БД и даже от версии. Например, на достаточно старых версиях (скажем, MySQL 3.х версии) модификация Вашего запроса в
при наличии определённой комбинации индексов может дать изрядный профит... На современных же серверах все запросы (кроме исходного) дадут абсолютно одинаковый план выполнения. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
-------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Он изрядно путает (особенно начинающих) некоторыми неявными фортелями с NULL... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Не только в этом. Если уж быть педантичным, то, хоть и очевидно, что поле с названием id должно быть уникальным, но пока об этом нигде не написано - ожидать что полусоединение (semi-join) будет эквивалентно вунтреннему - нельзя ![]() Это какие, к примеру? Здесь же inner, здесь пофиг, в on вставлять предикат или же в where. Главное оптимизатор не запутать. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Ну фраза была про джойн вообще... То да, по-хорошему там дистинкта нехватает. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Дистинкт не поможет нам добиться эквивалентности, если id не PK ![]() Ну и елси по теме, исходный запрос можно попробовать переформулировать на exists. Может статься, что план будет трошку получше. Это сообщение отредактировал(а) Zloxa - 18.6.2013, 10:54 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Acuna |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2013 Репутация: нет Всего: нет |
Akina, О! Не знал, что в FROM можно указать несколько таблиц. Интересная идея.
Zloxa, да, радует, что id уникальный, DISTINCT не нужен... P. S. Мда, все-таки пока, к сожалению так, как нужно, работает только с подзапросом :( Это сообщение отредактировал(а) Acuna - 18.6.2013, 19:52 |
|||
|
||||
SilverSoft |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 30.8.2011 Репутация: нет Всего: нет |
джоины - зло, они сильно усложняют работу при масштабировании проекта ) в том же facebook нет не одного джоина)
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Дистинкт не нужен если table2.post_id уникален. А относительно id речь была о том, что если он не уникален, то distinct не поможет Добавлено через 57 секунд Кислород - зло. В результате окислительных процессов человеческий организм стареет ![]() -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
ну да ну да... а всякие там WHERE t1.id=t2.id OR t2.id IS NULL - это самое что ни на есть добро... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Это ш тоже джойн. Товарищ явно начитался статей о носкуэль и проникся. Это ты так аутер в виду поимел? Не будет же так работать. Это ведь преджойн предикат. Для постжойн предикатов придуманы кастыли вроде '(+)', '*=','=*' Это сообщение отредактировал(а) Zloxa - 19.6.2013, 09:17 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |