|
|
|
| Вот собственно он:
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.
пожалуйста, подскажите в чем тут проблема? | |
|
|
|
|
|
|
|
для: 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 этого запроса. | |
|
|
|
|
|
|
|
для: Евгений Петров
(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. | |
|
|
|