userguest
12.09.2012 - 14:05
Здравствуйте.
Имеется несколько тысяч записей в двух таблицах.
Нужно выбрать каждую запись в одной таблице, и для данных в этой записи нужно выбрать данные из другой таблицы.
Скорость выполнения - критичный фактор, т.к. это всего лишь малая и незначительная доля всей "логики".
Как лучше сделать: использовать единственный запрос с LEFT JOIN или сделать выборку из одной таблицы, собрать все в массив (mysql_fetch_assoc), и для каждой записи массива сделать еще по одному запросу к бд (если количество записей в таблице принять равным 2000, то это 2001 запрос к БД)?
inpost
12.09.2012 - 14:11
2 запроса. Первый и второй, соединить на ПХП.
Или кешировать результат выборки, если данные не динамичные.
Left Join плохо себя проявляет вообще
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Placido
12.09.2012 - 14:11
JOIN + правильно расставить индексы.
userguest
12.09.2012 - 14:36
Спасибо за ответы. Inpost, 2 запроса. Как это сделать, если второй запрос возможен только после первого?
P.S. В данном случае не php, а perl, хотя это не имеет значения.
userguest
12.09.2012 - 14:40
Ну и данные, кстати, динамические, поэтому кеширование - не выход.
inpost
12.09.2012 - 14:46
после первого массива сформировать массив. Далее запрос ко второй таблице:
WHERE `id_parent` IN (тут перечисляешь поле, по которому соединяешь),
Далее склеиваешь данные к массиву.
А вообще, начни с индексов, возможно этого должно хватить.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Давно отказался от JOIN в пользу внешних ключей.
Пусть лучше таблица будет жирной и неповоротливой чем настолько медленной.
killer8080
12.09.2012 - 16:26
Если join объединяет по первичным ключам, или индексам, проблем с быстродействием быть не должно, по крайней мере это лучше чем 2000 запросов в цикле.
inpost
12.09.2012 - 17:22
killer8080У меня давал хуже результат, чем 300 запросов в цикле

Индексы были расставлены, таблицу брал во внимание на 10кк.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
inpostА если у тебя поиск используя критерии при найденных значениях LEFT JOIN ?
inpost
12.09.2012 - 18:17
СемёнРаз на раз не приходится. Я делюсь своим опытом, но это не значит побуждение к действию. Истинный программист сам проверит все методы и возьмет тот, который будет самый быстрый в данном случае. Я лишь варианты подсказал для проверки!
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
inpost
Если выбирать между вариантом вывода информации с подзагрузкой какойто инфы, твой способ реально будет быстрее при постраничной навигации и разбивке таких данных к примеру допустим даже по 50 записей, но с условием что таблица будет не менее 1млн записей, там где данных мало, JOIN будет имхо быстрее.
Если ситуация в которой, необходимо делать условия выборки я склоняюсь к тому что лучше использовать InnoDB с внешними ключами.
Фаулер так приводит своё мнение по поводу таких ситуаций.
Так как в большинстве своём сервера БД имеют распределённую структуру, то и каждый запрос будет удалённым (мало где встречаются сервера БД на одном и том же вместе с доменами) наподобие RPC. В основном проблемы создают задержки соединений к удалённым серверам и обработки запросов становятся более долгими. Конечно решение в пулах открытых соединений несколько "смягчает" ситуацию задержек, но всё же запросы остаются узким горлышком, так как удалённый запрос требует времени обработки.
Другая ситуация, при которой, создаётся один единственный запрос с присоединением JOIN. Это даёт хорошие результаты, так как запрос обрабатывается на одной программной платформе что и сама БД. При всём что в нынешнее время разработчики БД уже внедряют технологии кэширования на своих же программных платформах, JOIN довольно громоздкая операция и то же требует времени.
В результате, если использовать 3 - 5 JOIN запрос работает довольно быстро и если используется вместо него много отдельных запросов. Но если начинает увеличиваться связность и количество таблиц начинает проигрывать, особенно если раздельных запросов малое количество.
Опять же всё требует профилирования, если действительно требуется строгая производительность как правильно сказал inpost.
Invis1ble
13.09.2012 - 05:47
Цитата |
WHERE `id_parent` IN (тут перечисляешь поле, по которому соединяешь), |
вобще-то при использовании оператора IN MySQL не задействует индекс.
JOIN должен быть быстрее, чем 100500 запросов. Особенно, если грамотно расставлены индексы.
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
userguest
13.09.2012 - 18:44
"Попробую попробовать" разные варианты, но склонили к JOIN + индексы.
Цитата |
после первого массива сформировать массив. Далее запрос ко второй таблице: WHERE `id_parent` IN (тут перечисляешь поле, по которому соединяешь), Далее склеиваешь данные к массиву. |
Этот момент не уловил. Я в таком случае получу только данные из второй таблицы по данным из первой, но мне нужны и данные из первой таблицы, по которым не осуществляется поиск во второй. Т.е. из первой таблицы беру (напр.), uid и name, во второй ищу данные для name. В итоге мне нужны: uid из первой таблицы и данные из второй для name.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.