Creo que lo más simple es usar el muestreo de depósito ponderado:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Es un gran método que te permite elegir M de N elementos donde la probabilidad de ser elegido para cada elemento es proporcional a su peso. Funciona igual de bien cuando solo desea un elemento. El método se describe en este artículo . Tenga en cuenta que eligen los valores más grandes de POW(ALEATORIO(), 1/peso), lo que equivale a elegir los valores más pequeños de -LOG(ALEATORIO())/peso.