Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2008, 18:19   #1
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию Как оптимизировать запрос MySQL с выборкой из двух таблиц.

Здрасте.. Вот и я к вам за советом пришёл. Надеюсь поможете.

Вобщем, есть запрос из MySQL по выборке объекта с его фотографией.
Так как фотографий может быть несколько на объект и у каждой своё название и описание, а также фотографии могут меняться по ходу жизни проекта, то названия файлов для фотографий каждого объекта вынесены в отдельную таблицу.
Соответственно создал запрос вида:
PHP код:
SELECT obj.id, `reference`, `name_ru`, `price`, p.url FROM j_objects AS obj
JOIN 
(SELECT CEIL(RAND() * (SELECT MAX(`id`) FROM j_objects)) AS id) AS r2 USING (id)
STRAIGHT_JOIN j_photoes AS p ON p.owner obj.id
WHERE 
`active` = 1 LIMIT 1 
Задача данного запроса - выборка одного, случайного, объекта с некоторыми его полями и одной фотографией. Строка
PHP код:
JOIN (SELECT CEIL(RAND() * (SELECT MAX(`id`) FROM j_objects)) AS id) AS r2 USING (id
стянута с интернета для псевдо-случайной выборки объекта. Объектов предвидится ОЧЕНЬ много и подозревается, что стандартный ORDER BY rand() будет очень сильно тормозить скрипт.
Вобщем проблема в том, что не у всех объектов есть фотография. Если у рандомного объекта нет фотографии, то данный запрос возвращает пустой результат.
Теперь внимание, вопрос: "Возможно ли изменить данный запрос так, чтобы выбирался только объект имеющий хотя бы одну фотографию, без добавления нового поля в таблицу объектов? Если возможно, то как?"

Заранее всем спасибо.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 12.04.2008, 18:40   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А почему бы не перевернуть задачу - выбирать не случайный объект, а случайную фотографию и её объект?... Если "LIMIT 1", тем более...
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 18:50   #3
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Тогда чаще будут выбираться объекты с бОльшим количеством фотографий. А это не есть гут.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 12.04.2008, 19:57   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Что-то как я голову ни ломал, ничего туда кроме процедур, вспомогательной таблицы или order by rand() не пришло... Может стоит померять, что из этих вариантов будет быстрее работать?...
----------------------
Ещё, как вариант, можно попробовать сделать select ...... order by rand() по результату (select distinct owner from j_photoes), но боюсь это будет ещё медленнее...

Последний раз редактировалось B_N; 12.04.2008 в 20:10.
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 20:19   #5
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Любое использование order by rand() в таблице, где более 10000 записей конкретно тормозит выполнение скрипта.
У меня намечается более 10000 объектов, плюс 0-20 фотографий для каждого объекта. Соответственно использовать order by rand() невозможно.

Я думаю, что я добавлю просто счётчик фотографий в таблицу объекта. По-другому не могу найти. И выбирать буду только объект у которого более 0 фотографий.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 12.04.2008, 20:31   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Любое использование order by rand() в таблице, где более 10000 записей конкретно тормозит выполнение скрипта.
С этим никто и не спорит... Я выше зарапортовался с этим order by rand(), хотел предложить схему (SELECT CEIL(RAND()....) по (select distinct owner from j_photoes), но тоже сходу не соображу как там будет со скоростью, а здоровенной базы под рукой нет.

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Я думаю, что я добавлю просто счётчик фотографий в таблицу объекта. По-другому не могу найти. И выбирать буду только объект у которого более 0 фотографий.
А как Вы их будете выбирать случайным образом? Всё равно если (SELECT CEIL(RAND()....), то придется сформировать список, а если order by rand(), то то же самое....
B_N вне форума Ответить с цитированием
Старый 13.04.2008, 03:10   #7
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Так, хорошо... Вот здесь я потерялся...
В какой момент срабатывает условие "WHERE `active` = 1" ? Разве я не смогу добавить к нему "AND photoes > 0"?
Завтра утром зароюсь в мануал по этому поводу.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пожалуйста, с выборкой Chel БД в Delphi 24 05.06.2008 05:00
MySQL нужна библ. для Visual C++ (MySql++) Alexoid Visual C++ 8 07.05.2008 18:29
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57
запрос в MySQL, Error Teksa БД в Delphi 4 12.10.2007 22:03
Через запрос перенести данные с 6 таблиц Таня84 БД в Delphi 5 22.03.2007 15:46