Решение Я использую также размещены в ссылке ниже: How can i optimize MySQL's ORDER BY RAND() function?
Я предполагаю, что ваша таблица пользователей будет чем ваша таблица профилей, если нет, то это 1 к 1 мощности.
Если это так, я сначала сделаю случайный выбор на пользовательской таблице перед присоединением к таблице профилей.
сначала сделать выбор:
SELECT *
FROM users
WHERE users.ownership = 1 OR users.stamp = 1
Затем из этого пула, выбрать случайные строки через вычисленной вероятности. Если ваша таблица имеет M строк и вы хотите выбрать N случайных строк, вероятность случайного выбора должна быть N/M. Следовательно:
SELECT *
FROM
(
SELECT *
FROM users
WHERE users.ownership = 1 OR users.stamp = 1
) as U
WHERE
rand() <= $limitCount/(SELECT count(*) FROM users WHERE users.ownership = 1 OR users.stamp = 1)
Где N является пределом $ limitCount и M является подзапросом, который вычисляет счетчик строк таблицы. Однако, поскольку мы работаем над вероятностью, возможно получить МЕНЬШЕ, чем $ limitCount возвращаемых строк. Поэтому мы должны умножить N на коэффициент увеличения случайного пула.
т.е.:
SELECT*
FROM
(
SELECT *
FROM users
WHERE users.ownership = 1 OR users.stamp = 1
) as U
WHERE
rand() <= $limitCount * $factor/(SELECT count(*) FROM users WHERE users.ownership = 1 OR users.stamp = 1)
Я обычно набор $ = коэффициент 2. Можно установить коэффициент на более низкое значение, чтобы дополнительно уменьшить размер пула случайных (например, 1,5).
На данный момент мы бы уже ограничили таблицу размеров M примерно до 2N. Отсюда мы можем сделать JOIN, а затем LIMIT.
SELECT *
FROM
(
SELECT *
FROM
(
SELECT *
FROM users
WHERE users.ownership = 1 OR users.stamp = 1
) as U
WHERE
rand() <= $limitCount * $factor/(SELECT count(*) FROM users WHERE users.ownership = 1 OR users.stamp = 1)
) as randUser
JOIN profiles
ON randUser.id = profiles.memberid AND profiles.photo != ''
LIMIT $limitCount
На большой таблице этот запрос будет превосходить обычный запрос ORDER по запросу RAND().
Надеюсь, это поможет!
Я не понимаю, что вы ищете. Почему '' ORDER BY RAND() 'подходит? Вы в основном озабочены эффективностью? – outis
Да, это так. Я не дошел даже до масштаба, представленного на вашем графике, и я уже принимал удар. – Tony
@outis: поскольку он не масштабируется - см .: http://www.dasprids.de/blog/2008/06/07/fetching-random-rows-of-mysql-efficiently –