Если у вас есть сценарий «запись-редко-чтение-много» (т.е. вы редко меняете объекты и вероятности), вы можете заранее рассчитать значения вероятности, чтобы при наличии единственного случайного значения вы могли однозначно решить, объект для выбора (с одним выбором, без сортировки, без сравнения всех записей).
например. (вероятности на мельницу)
зонт: 500 ‰ шанс
сапоги: 250 ‰ шанс
сумка: 100 ‰ шанс
все: 100 ‰ шанс
«ничего»: 50 ‰ шанс
Случайное число от 0 до 499 означает, что "зонтик" выбран, 500-749 "сапог" и т. Д.
INSERT INTO foo (name, randmin, randmax) VALUES
('umbrella', 0, 499),
('boots', 500, 749),
('satchel', 750, 849),
('whatever', 850, 949)
Каждый раз, когда вы добавляете объект или изменяете вероятности, воссоздайте эту таблицу.
Тогда все, что вам нужно, это запрос типа
SELECT
f.name
FROM
(
SELECT Round(Rand()*1000) as r
) as tmp
JOIN
foo as f
ON
r BETWEEN f.randmin and f.randmax
LIMIT
1
Необходимо сгенерировать только одно случайное значение, и MySQL может использовать индекс on (randmin, randmax) для быстрого поиска записи.