2016-02-26 4 views
0

Мне нужно выбрать 30 случайных записей из таблицы, за исключением того, что запрос использует одну секунду, и это замедляет mysql, если контент отображается многими пользователями. Это запрос:MYSQL: порядок запросов по rand() очень медленный

SELECT relationship, COUNT(id) AS number FROM FR_user_friends GROUP BY relationship ORDER BY rand() LIMIT 30 

Вы знаете, как ускорить этот запрос? Спасибо.

Если я удалю rand(), запрос выполняется быстро. Нам нужно найти альтернативу для rand()

+2

Возможный дубликат [Как я могу оптимизировать функцию ORDER BY RAND() MySQL?) (Http://stackoverflow.com/questions/1244555/how-can-i-optimize-mysqls-order-by-rand-function) –

+0

Я думаю, что вам нужен индекс в столбце 'relationship' – devpro

+0

Он уже проиндексирован. –

ответ

5

ORDER BY RAND() заставляет двигатель генерировать случайные значения для всех строк, поэтому, если вы хотите выбрать несколько строк из большой таблицы, это дает очень плохую производительность.

Вы можете, например, генерировать 30 случайных значений в php в диапазоне [1, максимальный номер строки] и выбирать первую строку с идентификатором строки, которая больше или равна случайному значению с LIMIT 1.

SQL-only способы решения этой проблемы вы найдете в How can i optimize MySQL's ORDER BY RAND() function? (но некоторые из них также не являются тривиальными).

+0

Вы можете написать php-код? –

+5

Да, могу. ; -P Но SO не является услугой кодирования, а помогает в решении конкретных вопросов. Поэтому я бы посоветовал сначала попробовать его попробовать. – syck

Смежные вопросы