Случайная строка MySQL с низким уровнем системных ресурсов PHP

Я хочу получить случайную строку из MySQL, не используя слишком много времени или ресурсов в системе. Меня не волнует, основан ли данный код на PHP или MySQL, однако обратите внимание, что в моей таблице есть «пробелы».

Столбцы моей таблицы: «id» (первичный ключ, автоматическое увеличение), varchar, int, int

Я хотел бы, чтобы это было как можно более случайным


person smdvlpr    schedule 10.11.2009    source источник
comment
в SO уже есть несколько ответов на этот вопрос. Выполните поиск.   -  person dnagirl    schedule 10.11.2009
comment
Вас волнует распределение вероятностей?   -  person Ben S    schedule 10.11.2009
comment
Дубликат: заголовок stackoverflow.com/questions/142242/   -  person OMG Ponies    schedule 10.11.2009
comment
Также: stackoverflow.com/search?q=mysql+random   -  person OMG Ponies    schedule 10.11.2009
comment
Можете ли вы привести пример данных с пробелами?   -  person Ivan Nevostruev    schedule 10.11.2009


Ответы (3)


Я бы сделал это в два запроса и три шага в целом.

  1. Найдите количество строк в таблице, используя SELECT COUNT(*) FROM your_table
  2. Используйте математические функции PHP, чтобы найти случайное число между 0 и количеством строк.
  3. Получите фактические данные, которые вы хотите, используя SELECT * FROM your_table LIMIT 200, 1, где 200 — это случайное число, которое вы вычислили на шаге 2.
person mwalling    schedule 10.11.2009
comment
Вы можете сделать все это в хранимой процедуре, сохранив поездку, чтобы получить счет и вернуться. Если база данных находится на другом хосте, вы дополнительно снижаете нагрузку на веб-сервер, чтобы она была доступна для того, для чего она предназначена... - person OMG Ponies; 10.11.2009
comment
Истинный. Я не использую хранимые процедуры на регулярной основе, поэтому я не думаю об их использовании там, где они были бы полезны :) - person mwalling; 10.11.2009

Хорошее решение было в Как лучше всего выбрать случайную строку из таблицы в MySQL? вопрос.

person Ivan Nevostruev    schedule 10.11.2009
comment
Не игнорируйте пробелы в моей таблице: P - person smdvlpr; 10.11.2009

Ты можешь использовать:

SELECT id FROM table ORDER BY RAND() limit 1
person Andrei Serdeliuc ॐ    schedule 10.11.2009
comment
Нет, спасибо, в этой таблице слишком много строк, чтобы это было эффективно. - person smdvlpr; 10.11.2009
comment
Как тут не жадничать? Если мы пытаемся получить одну строку из таблицы с пробелами, единственный способ A) получить случайную запись и B) гарантировать, что мы действительно возвращаем действительную запись, - это быть исчерпывающим, т.е. рассмотреть набор всех первичных ключей. в таблице и выбрать случайным образом. При использовании вероятностных методов нет гарантии, что вы вернете правильную запись. Если, однако, это не проблема (если вам не требуется, чтобы вы всегда возвращали действительную запись), то у mwalling есть решение ниже. - person Chris Tonkinson; 10.11.2009
comment
За исключением случая, когда ваше случайное число очень близко к размеру таблицы, а строки были удалены между двумя запросами, что привело к превышению размера таблицы, как вы не собираетесь получить действительную запись? - person mwalling; 10.11.2009