Как запросить случайные записи в таблице MYSQL при факторинге в приоритетной системе - PullRequest
3 голосов
/ 23 августа 2011

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

ID   | Priority
---------------
#1   | 25
#2   | 50
#3   | 125
#4   | 300
#5   | 500

Для каждых 1000 запросов (в среднем) я хотел бы получить идентификатор # 1 25 раз, # 2 50 раз, # 3 125 раз и т. Д.

В моей таблице будет 1000 и, в конечном итоге, более 100 000 записей. Можно ли будет масштабировать это?

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

Я определенно готов пересмотреть структуру таблиц, если есть более эффективный метод - любой совет?

1 Ответ

3 голосов
/ 23 августа 2011

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

Есть два пути, по которым вы можете пойти:

  1. Используя такую ​​таблицу весов, как вы, затем умножьте ее на случайное число для каждой строки.
  2. Наличие количества записей с каждым идентификатором в вашей таблице отражает ваш вес. например # 2 в два раза чаще, чем # 1, поэтому # 1 имеет 1 запись, а # 2 имеет две записи. Если # 3 в четыре раза чаще, чем # 2, тогда у него будет восемь записей и т. Д. Этот метод имеет большой, главный недостаток - если # 4 вдвое меньше вероятности, чем # 1, то единственное решение - удвоить число записей, которые есть у каждого другого типа, а затем вставьте одну запись для # 4. Очень, очень грязный, чтобы отследить.

Имея это в виду, вот решение с использованием подхода 1:

SELECT ID
FROM tablename
ORDER BY (RAND() * Priority) DESC
LIMIT 1;

(Я не уверен на 100% в синтаксисе, так как я руководитель SQL Server / Oracle, в отличие от MySQL, но я думаю, что это правильно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...