mysql order by rand () проблема производительности и решение

Я использовал order by rand () для генерации случайных строк из базы данных без каких-либо проблем, но я уточнил, что по мере увеличения размера базы данных этот rand () вызывает большую нагрузку на сервер, поэтому я искал альтернативу, и я попытался создать одно случайное число используя функцию php rand () и поместив ее как id в запрос mysql, и это было очень быстро, поскольку mysql знал идентификатор строки, но проблема в моей таблице. Все числа не доступны. Например, 1,2,5,9, 12 вот так.

если php rand () сгенерирует число 3,4 и т. д., запрос будет пустым, поскольку нет идентификатора с номером 3, 4 и т. д.

лучший способ генерировать случайные числа, предпочтительные из php, но он должен генерировать доступный нет в этой таблице, поэтому он должен проверить, что table.please советует.

$id23=rand(1,100000000); SELECT items FROM tablea where status='0' and id='$id23' LIMIT 1 

вышеупомянутый запрос выполняется быстро, но иногда генерирует нет, что не доступно в базе данных.

  SELECT items FROM tablea where status=0 order by rand() LIMIT 1 

вышеуказанный запрос слишком медленный и вызывает большую нагрузку на сервер

Во-первых, все генерируют случайное значение от 1 до MAX (id), а не 100000000.

Тогда есть, по крайней мере, несколько хороших решений:

  1. Используйте > not =

     SELECT items FROM tablea where status='0' and id>'$id23' LIMIT 1 

    Создайте индекс (status,id,items) чтобы сделать этот запрос только индексированным.

  2. Используйте = , но просто повторите попытку с другим случайным значением, если вы не нашли хита. Иногда это займет несколько попыток, но часто это займет всего одну попытку. Значение = должно быть быстрее, так как оно может использовать первичный ключ. И если он быстрее и получает его в одну попытку в 90% случаев, это может компенсировать остальные 10% времени, когда требуется более одной попытки. Зависит от того, сколько пробелов у вас есть в ваших значениях id.

Используйте свою БД для нахождения максимального значения из таблицы, генерируйте случайное число, меньшее или равное этому значению, возьмите первую строку, в которой идентификатор больше или равен вашему случайному числу. Нет необходимости в PHP.

 SELECT items FROM tablea WHERE status = '0' and id >= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablea)) LIMIT 1 

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

Вы бы взяли эту колонку и использовали ее в качестве индекса сортировки. Это хорошо работает для большой среды чтения и создает предикативный случайный порядок в течение определенного периода времени.

Возможным решением является использование предела:

 $id23=rand(1,$numberOfRows); SELECT items FROM tablea where status='0' LIMIT $id23 1 

Это не приведет к пропущенным строкам (но, как упоминалось в hek2mgl), нужно знать количество строк в элементе select.