Решение, которое я использую, также размещено в ссылке ниже:
Как я могу оптимизировать функцию ORDER BY RAND () в MySQL?
Я предполагаю, что ваша таблица пользователей будет больше, чем таблица ваших профилей, если нет, то это будет от 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)
Обычно я устанавливаю $ factor = 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 ().
Надеюсь, это поможет!