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

MySQL:Alternativas a ORDEN POR ALEATORIO()

ACTUALIZACIÓN 2016

Esta solución funciona mejor con una columna indexada .

Este es un ejemplo simple de un banco de consultas optimizado marcado con 100 000 filas.

OPTIMIZADO:300ms

SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id

nota sobre la cantidad límite :límite 4 y 4/cuenta(*). Los 4 deben ser el mismo número. Cambiar la cantidad que devuelve no afecta tanto la velocidad. El punto de referencia en el límite 4 y el límite 1000 son iguales. Límite 10,000 lo llevó hasta 600ms

nota sobre unirse :Aleatorizar solo el id es más rápido que aleatorizar una fila completa. Como tiene que copiar toda la fila en la memoria, luego aleatorizarla. La unión puede ser cualquier tabla que esté vinculada a la subconsulta Es para evitar escaneos de tablas.

note la cláusula where :La cuenta where limita la cantidad de resultados que se aleatorizan. Toma un porcentaje de los resultados y los ordena en lugar de toda la tabla.

observar subconsulta :Las condiciones de la cláusula if haciendo uniones y extra where necesita ponerlas tanto en la subconsulta como en la subsubconsulta. Para tener un conteo preciso y recuperar los datos correctos.

SIN OPTIMIZAR:1200ms

SELECT 
    g.*
FROM
    table g
ORDER BY RAND()
LIMIT 4

PROS

4 veces más rápido que order by rand() . Esta solución puede funcionar con cualquier tabla con una columna indexada.

CONTRAS

Es un poco complejo con consultas complejas. Necesita mantener 2 bases de código en las subconsultas