Если у вас есть индекс в столбце odds и первичный ключ, это будет очень эффективно:
SELECT id, odds FROM table WHERE odds > 0
База данных даже не будет читать из таблицы, она получит всеэто нужно из индекса шансов.
Затем вы выберете случайное значение между 1 и числом возвращаемых строк.
Затем выберите эту строку из возвращенного массива строк.
Затем, наконец, выберите целевую строку целиком:
SELECT * FROM table WHERE id = ?
Это обеспечивает равномерное распределение между всеми строками со значением коэффициента.
В качестве альтернативы, введите коэффициентыв другой таблице с первичным ключом автоинкремента.
Odds
ID odds
1 4
2 9
3 56
4 12
Сохраните внешний ключ идентификатора в главной таблице вместо значения шансов и индексируйте его.
Сначала получите максимумзначение.Это никогда не касается базы данных.Он использует индекс:
SELECT MAX(ID) FROM Odds
Получить случайное значение от 1 до макс.
Затем выберите запись.
SELECT * FROM table
JOIN Odds ON Odds.ID = table.ID
WHERE Odds.ID >= ?
LIMIT 1
Это потребует некоторого обслуживания, еслиВы склонны удалять значение Odds или откатывать вставки, чтобы сохранить равномерность распределения.
В книге есть целая глава по случайному выбору SQL Antipatterns .