speed query queries optimize how high best accelerate mysql performance random

query - ¿Cuándo funciona el orden de función ORDER BY RAND() de MySQL?



mysql views performance (4)

He leído sobre ORDER BY RAND () y sus problemas de rendimiento. ¿Esto solo se aplica a las consultas que devuelven grandes conjuntos de datos? Por ejemplo, si tengo una tabla con 100.000 filas y devuelvo un conjunto de datos con 10 registros utilizando una cláusula WHERE y luego uso ORDER BY RAND () LIMIT 1, ¿se aplicará este ORDER BY RAND () DESPUÉS de que mi tabla se haya filtrado a registros que coinciden con la cláusula WHERE, y por lo tanto tienen problemas de rendimiento insignificantes?


El valor RAND() se calculará para cada fila, por lo que no es muy eficiente para grandes conjuntos de datos, la cláusula LIMIT no cambia eso. La forma habitual de evitar esto es calcular un número aleatorio por adelantado y luego recuperar la fila correspondiente según una columna indexada pregenerada.

Aquí hay una explicación detallada:

http://jan.kneschke.de/projects/mysql/order-by-rand/


En función de una prueba rápida, debo concluir que ORDER BY RAND () se aplica solo después de aplicar la sentencia WHERE y no a todo el conjunto de datos.

Resultados de una tabla con 50,000 filas:

SELECT * FROM `mytable` LIMIT 1 (1 total, Query took 0.0007 sec) SELECT * FROM `mytable` WHERE First = ''Hilda'' LIMIT 1 (1 total, Query took 0.0010 sec) SELECT * FROM `mytable` WHERE First = ''Hilda'' (142 total, Query took 0.0201 sec) SELECT * FROM `mytable` WHERE First = ''Hilda'' ORDER BY RAND() LIMIT 1 (1 total, Query took 0.0229 sec) SELECT * FROM `mytable` WHERE First = ''Hilda'' ORDER BY RAND() (142 total, Query took 0.0236 sec) SELECT * FROM `mytable` ORDER BY RAND() LIMIT 1 (1 total, Query took 0.4224 sec)


Tiene razón, aplicará el ORDER BY después de reducir el número de filas con WHERE, GROUP BY y HAVING. Pero aplicará ORDER BY antes de LIMIT.

Así que si filtra el número de filas hacia abajo lo suficiente, entonces sí, ORDER BY RAND () puede lograr lo que quiere sin un gran impacto en el rendimiento. Existe un beneficio legítimo para el código que es simple y fácil de leer.

El problema surge cuando crees que tu consulta debería reducir las filas a algo pequeño, pero con el tiempo a medida que crecen tus datos, el número de filas que necesita ordenar vuelve a ser grande. Desde su consulta, LIMIT 10 en el resultado ordenado oculta el hecho de que está realizando ORDER BY RAND () en 500k filas. Usted acaba de ver que el rendimiento empeora misteriosamente.

He escrito sobre métodos alternativos para elegir una fila aleatoria en mi libro SQL Antipatterns: Cómo evitar las trampas de la programación de bases de datos , o en otras respuestas aquí en :


No importa cuántas filas seleccione. Si ORDER BY RAND() se calcula un número aleatorio para cada fila de la tabla. Esto se debe a que debe calcular el valor aleatorio de cada fila para saber qué fila generó el valor más grande. Entonces, si tiene una tabla con 100.000 filas y luego llama a ORDER BY RAND() LIMIT 1 Le está diciendo a MySQL que genere un número aleatorio para 100,000 filas, ordenelas por ese número, y luego le proporcione la primera.

Es mucho más rápido para:

  1. SELECCIONAR CUENTA (*) DE LA Table

  2. Genere un número aleatorio entre 0 y el resultado de la consulta anterior menos 1 en su lenguaje de programación / scripting.

  3. SELECCIONAR * FROM Table LIMIT random_number_here, 1