Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите успростить трехтабличный запрос
 
 автор: on_worrk   (14.05.2009 в 14:08)   письмо автору
 
 

Вот собственно он:

SELECT 
`dating_foto`.`id_foto`, `dating_foto`.`id_user`,`dating_foto`.`title`,`dating_foto`.`status`,
`login`, `sex`, `age`, `color`, `fotos`, `city`
FROM `dating_foto`
LEFT JOIN
 ( SELECT 
     `site_users`.`id`,
     `site_users`.`login` AS `login`,
     `site_users`.`sex` AS `sex`,
     DATE_FORMAT(DATE_SUB(FROM_DAYS(TO_DAYS(NOW()) - TO_DAYS(`site_users`.`bdata`)), INTERVAL 1 MONTH ), '%y') AS `age`,
     `site_users`.`cv1` AS `color`,
     `site_users`.`fotos` AS `fotos`,
     `site_users`.`id_city` AS `id_city`
   FROM `site_users`
) AS `su` ON `su`.`id`=`dating_foto`.`id_user`
LEFT JOIN
  ( SELECT
     `dating_city`.`city` AS `city`,
     `dating_city`.`id`
   FROM `dating_city`
) AS `us` ON `us`.`id`=`id_city`
WHERE `age` != '' AND `dating_foto`.`status` = 'dating' AND `city` != ''
ORDER BY RAND()
LIMIT 5


думаю понятно, что вытягиваем из таблицы с фотографиями 5 случайных фоток,
затем получаем инфо о владельце фотки
и напоследок - его город.

Проблема в том, что запрос выполняется "через раз" - то быстро и беспроблемно, то висит несколько секунд и nginx выдает Bad gateway.
пожалуйста, подскажите в чем тут проблема?

  Ответить  
 
 автор: Евгений Петров   (16.05.2009 в 04:01)   письмо автору
 
   для: on_worrk   (14.05.2009 в 14:08)
 

Для начала как то так

SELECT 
    `dating_foto`.`id_foto`,
    `dating_foto`.`id_user`,
    `dating_foto`.`title`,
    `dating_foto`.`status`,
    `login`,
    `sex`,
    `age`,
    `color`,
    `fotos`,
    `city`,
     `site_users`.`id`,
     `site_users`.`login` AS `login`,
     `site_users`.`sex` AS `sex`,
     DATE_FORMAT(DATE_SUB(FROM_DAYS(TO_DAYS(NOW()) - TO_DAYS(`site_users`.`bdata`)), INTERVAL 1 MONTH ), '%y') AS `age`,
     `site_users`.`cv1` AS `color`,
     `site_users`.`fotos` AS `fotos`,
     `site_users`.`id_city` AS `id_city`,
     `dating_city`.`city` AS `city`,
     `dating_city`.`id`
FROM
    `dating_foto`
LEFT JOIN
    `site_users` AS `su` ON
        `su`.`id`=`dating_foto`.`id_user`
LEFT JOIN
    `dating_city` AS `us` ON
        `us`.`id`=`id_city`
WHERE
    `age` != ''
    AND `dating_foto`.`status` = 'dating'
    AND `city` != ''
ORDER BY RAND()
LIMIT 5


дальше избавляемся от ORDER BY RAND() - его использование автоматически говорит о том что будет произведена файловая сортировка по результату выборки. Самый простой вариант сделать так:

SELECT
    ...
    RAND() AS rnd
FROM
    ...
ORDER BY
    rnd
LIMIT 5


работать все равно долго будет но намного быстрее первого варианта. Можно поиграться с первичным ключем в WHERE. Можно результат занести во временную табилцу со случайным индексированным полем rnd и потом сортировать по этому полю. А ещё приведите EXPLAIN этого запроса.

  Ответить  
 
 автор: Trianon   (16.05.2009 в 10:29)   письмо автору
 
   для: Евгений Петров   (16.05.2009 в 04:01)
 

>дальше избавляемся от ORDER BY RAND() - его использование автоматически говорит о том что будет произведена файловая сортировка по результату выборки. Самый простой вариант сделать так:
>
>
SELECT
>    ...
>    RAND() AS rnd
>FROM
>    ...
>ORDER BY
>    rnd
>LIMIT 5

>
>работать все равно долго будет но намного быстрее первого варианта.

http://dev.mysql.com/doc/refman/5.1/en/mathematical-functions.html#function_rand
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования