sql >> Base de Datos >  >> RDS >> Mysql

MySQL RAND () ¿con qué frecuencia se puede usar? ¿Usa /dev/random?

El generador de números pseudoaleatorios de MySQL es completamente determinista. Los documentos dicen:

No puede usar /dev/random porque MySQL está diseñado para funcionar en una variedad de sistemas operativos, algunos de los cuales no tienen /dev/random.

MySQL inicializa una semilla predeterminada al inicio del servidor, utilizando el número entero devuelto por time(0) .Si está interesado en la línea fuente, está en la fuente MySQL en el archivo sql/mysqld.cc, función init_server_components() . No creo que vuelva a sembrarse solo.

Luego, los números "aleatorios" posteriores se basan únicamente en la semilla. Ver archivo fuente mysys_ssl/my_rnd.cc, función my_rnd() .

La solución de mejores prácticas para su tarea de selección aleatoria, tanto para el rendimiento como para la calidad de la aleatorización, es generar un valor aleatorio entre el valor mínimo de la clave principal y el valor máximo de la clave principal. Luego use ese valor aleatorio para seleccionar una clave principal en su tabla:

SELECT ... FROM MyTable WHERE id > $random LIMIT 1

La razón por la que usaría> en lugar de =es que podría tener espacios en la identificación debido a que las filas se eliminaron o retrocedieron, o podría tener otras condiciones en su cláusula WHERE para que tenga espacios entre las filas que coincidan con sus condiciones .

Las desventajas de este método mayor que:

  • Las filas que siguen a una brecha de este tipo tienen una mayor probabilidad de ser elegidas, y cuanto mayor sea la brecha, mayor será la probabilidad.
  • Necesita saber el MIN(id) y MAX(id) antes de generar el valor aleatorio.
  • No funciona tan bien si necesita más de una fila aleatoria.

Ventajas de este método:

  • Es mucho más rápido que ORDER BY RAND(), incluso para un tamaño de mesa modesto.
  • Puede usar una función aleatoria fuera de SQL.