[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: LEFT JOIN или простые запросы (скорость работы)
userguest
Здравствуйте.
Имеется несколько тысяч записей в двух таблицах.
Нужно выбрать каждую запись в одной таблице, и для данных в этой записи нужно выбрать данные из другой таблицы.
Скорость выполнения - критичный фактор, т.к. это всего лишь малая и незначительная доля всей "логики".

Как лучше сделать: использовать единственный запрос с LEFT JOIN или сделать выборку из одной таблицы, собрать все в массив (mysql_fetch_assoc), и для каждой записи массива сделать еще по одному запросу к бд (если количество записей в таблице принять равным 2000, то это 2001 запрос к БД)?
inpost
2 запроса. Первый и второй, соединить на ПХП.
Или кешировать результат выборки, если данные не динамичные.

Left Join плохо себя проявляет вообще smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Placido
JOIN + правильно расставить индексы.
userguest
Спасибо за ответы. Inpost, 2 запроса. Как это сделать, если второй запрос возможен только после первого?
P.S. В данном случае не php, а perl, хотя это не имеет значения.
userguest
Ну и данные, кстати, динамические, поэтому кеширование - не выход.
inpost
после первого массива сформировать массив. Далее запрос ко второй таблице:
WHERE `id_parent` IN (тут перечисляешь поле, по которому соединяешь),
Далее склеиваешь данные к массиву.

А вообще, начни с индексов, возможно этого должно хватить.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Семён
Давно отказался от JOIN в пользу внешних ключей.
Пусть лучше таблица будет жирной и неповоротливой чем настолько медленной.
killer8080
Если join объединяет по первичным ключам, или индексам, проблем с быстродействием быть не должно, по крайней мере это лучше чем 2000 запросов в цикле.
inpost
killer8080
У меня давал хуже результат, чем 300 запросов в цикле smile.gif Индексы были расставлены, таблицу брал во внимание на 10кк.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Семён
inpost
А если у тебя поиск используя критерии при найденных значениях LEFT JOIN ? smile.gif
inpost
Семён
Раз на раз не приходится. Я делюсь своим опытом, но это не значит побуждение к действию. Истинный программист сам проверит все методы и возьмет тот, который будет самый быстрый в данном случае. Я лишь варианты подсказал для проверки! smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Семён
inpost
Если выбирать между вариантом вывода информации с подзагрузкой какойто инфы, твой способ реально будет быстрее при постраничной навигации и разбивке таких данных к примеру допустим даже по 50 записей, но с условием что таблица будет не менее 1млн записей, там где данных мало, JOIN будет имхо быстрее.
Если ситуация в которой, необходимо делать условия выборки я склоняюсь к тому что лучше использовать InnoDB с внешними ключами.
Guest
Фаулер так приводит своё мнение по поводу таких ситуаций.
Так как в большинстве своём сервера БД имеют распределённую структуру, то и каждый запрос будет удалённым (мало где встречаются сервера БД на одном и том же вместе с доменами) наподобие RPC. В основном проблемы создают задержки соединений к удалённым серверам и обработки запросов становятся более долгими. Конечно решение в пулах открытых соединений несколько "смягчает" ситуацию задержек, но всё же запросы остаются узким горлышком, так как удалённый запрос требует времени обработки.
Другая ситуация, при которой, создаётся один единственный запрос с присоединением JOIN. Это даёт хорошие результаты, так как запрос обрабатывается на одной программной платформе что и сама БД. При всём что в нынешнее время разработчики БД уже внедряют технологии кэширования на своих же программных платформах, JOIN довольно громоздкая операция и то же требует времени.
В результате, если использовать 3 - 5 JOIN запрос работает довольно быстро и если используется вместо него много отдельных запросов. Но если начинает увеличиваться связность и количество таблиц начинает проигрывать, особенно если раздельных запросов малое количество.
Опять же всё требует профилирования, если действительно требуется строгая производительность как правильно сказал inpost.
Invis1ble
Цитата
WHERE `id_parent` IN (тут перечисляешь поле, по которому соединяешь),

вобще-то при использовании оператора IN MySQL не задействует индекс.
JOIN должен быть быстрее, чем 100500 запросов. Особенно, если грамотно расставлены индексы.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

userguest
"Попробую попробовать" разные варианты, но склонили к JOIN + индексы.
Цитата

после первого массива сформировать массив. Далее запрос ко второй таблице:
WHERE `id_parent` IN (тут перечисляешь поле, по которому соединяешь),
Далее склеиваешь данные к массиву.

Этот момент не уловил. Я в таком случае получу только данные из второй таблицы по данным из первой, но мне нужны и данные из первой таблицы, по которым не осуществляется поиск во второй. Т.е. из первой таблицы беру (напр.), uid и name, во второй ищу данные для name. В итоге мне нужны: uid из первой таблицы и данные из второй для name.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.