2009-05-12 12 views
6

¿Es más rápido aleatorizar el orden de clasificación de un gran conjunto de resultados en el servidor MySQL o después de haber recibido los datos en PHP?Más rápido para aleatorizar muchos resultados en el servidor MySQL o en PHP

¿Alguien tiene datos para respaldar una de las partes, o incluso una experiencia anecdótica?

+1

Lo probaría para demostrar si existe un problema de cualquier manera, antes de preocuparme por ello. Tendría que tener una gran cantidad de datos antes de que importara mucho, supongo. De hecho, sería interesante comparar la cantidad de tiempo que ha dedicado publicar esto y digerir las respuestas, en comparación con elegir un enfoque, implementarlo, cambiarlo y compararlo. (Solo especulación, no una crítica, todos hacemos estos ejercicios mentales.) – dkretz

+0

sí, pero si alguien responde bien esta pregunta, entonces aprenderé sin toda esta inversión de tiempo, y yo y otros podemos mejorar su código. Creo que es una buena pregunta si independientemente de si existe un problema. – nickf

Respuesta

5

Mi conjetura es que MySQL gana sin límites. Está hecho para manejar datos de esta manera. La gran sobrecarga de tener que mover todos los datos a PHP para ordenar le da una ventaja para arrancar.

Puede averiguarlo haciendo benchmarking, por supuesto.

+0

Estoy de acuerdo en que esta es la respuesta probable, sin embargo, no puedo hacer el punto de referencia en este momento, no creo que tenga suficientes datos en este momento, pero lo veo como un problema en el futuro cercano. – UnkwnTech

1

Usando RAND() en MySQL será definitivamente sea más rápido.

Para aleatorizar a través de PHP, debe consultar el archivo db y insertar los datos en la memoria, por lo que tiene un paso adicional adicional que agrega sobrecarga a su proceso de clasificación.

En MySQL, este tipo de consulta no será tan rápido como ordenar por un valor indexado, pero aún estará altamente optimizado.

0

Tenga en cuenta que use rand() como el objeto de la orden por la declaración:

select * from foo_table order by rand() limit 100 
4

Para asegurarse de que debería hacerlo en MySQL lado.

Pero tenga en cuenta que es ORDER BY RAND() muy ineficientes en MySQL ya que requiere filesort.

saber cómo seleccionar 10 filas al azar de manera eficiente con una sola exploración de tabla:

SELECT * 
FROM (
     SELECT @cnt := COUNT(*) + 1, 
       @lim := 10 
     FROM t_random 
     ) vars 
STRAIGHT_JOIN 
     (
     SELECT r.*, 
       @lim := @lim - 1 
     FROM t_random r 
     WHERE (@cnt := @cnt - 1) 
       AND RAND() < @lim/@cnt 
     ) i 

Lee este artículo en mi blog para los detalles de rendimiento:

Para una 1,000,000 tabla de registros, se ejecuta en menos de un segundo en lugar de 15 secon ds usando ORDER BY RAND().

Cuestiones relacionadas