Оптимизированный способ получить x случайных строк, удовлетворяющих заданным критериям в MySQL - PullRequest
4 голосов
/ 14 февраля 2011

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

SELECT * FROM 'vids' WHERE 'cat'=n ORDER BY RAND() LIMIT x

Я ищу наиболее оптимизированный способ сделать то же самое {Низкий уровень использования системных ресурсов - главный приоритетСледующим важным приоритетом является скорость запроса}.Кроме того, в дизайне таблицы, я должен сделать 'кошка' ИНДЕКС?

Ответы [ 2 ]

0 голосов
/ 24 июля 2012

Я тоже пытаюсь придумать, как это сделать. На данный момент я думаю о следующих трех альтернативах:

1) выберите случайные строки, игнорирующие критерии, затем отбросьте те, которые не соответствуют на уровне приложения, и выберите больше случайных строк, если необходимо. Этот метод будет эффективен, если ваш критерий соответствует множеству строк в вашей таблице, возможно, 20% или более (необходимо провести сравнительный анализ)

2) выберите строки, соответствующие критериям, и выберите строку на основе случайного числа от 1 до счетчика (*) (случайное число, определенное в приложении). Это будет эффективно, если данные, соответствующие критериям, распределены равномерно, но ужасно потерпит неудачу, если, например, вы выбираете диапазон дат, и большинство случайных чисел попадет в записи за пределами этого диапазона.

3) моя любимая на данный момент, но и самая большая работа. Для каждой комбинации критериев, которую вы собираетесь использовать для выбора случайной записи, вы вставляете запись в специальную таблицу для этих критериев. Затем вы выбираете случайные записи из специальной таблицы и возвращаетесь к своим данным. Например, у вас может быть такая таблица:

Настольный кот: имя, возраст, цвет глаз, тип меха

Если вы хотите иметь возможность выбирать случайных кошек с коричневым мехом, то вам нужен такой стол:

Таблица cats_with_brown_fur: id (автономный номер), cat_fk

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

Во всяком случае, это мой текущий взгляд. Удачи

0 голосов
/ 16 июня 2011

Порядок по Rand () - плохая идея.

Вот лучшее решение: Как я могу оптимизировать функцию ORDER BY RAND () MySQL?

Google - твой друг, многие объясняют это лучше, чем я когда-либо мог.
http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/ http://www.phpbuilder.com/board/showthread.php?t=10338930 http://www.paperplanes.de/2008/4/24/mysql_nonos_order_by_rand.html

...