ORDER BY RAND()
es lento porque el DBMS tiene que leer todas las filas, ordenarlas todas, solo para mantener solo unas pocas filas. Por lo tanto, el rendimiento de esta consulta depende en gran medida del número de filas de la tabla y disminuye a medida que aumenta el número de filas.
No hay forma de optimizar eso.
Sin embargo, hay alternativas:
Puede implementar "obtener 5 filas aleatorias" haciendo 6 consultas:
- obtener el número de filas en la tabla (puede almacenar en caché este)
-
haz 5 consultas con
OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1
(es decir, lea y devuelva solo una fila de algún desplazamiento aleatorio)Por ejemplo:
SELECT * FROM Products OFFSET 42 LIMIT 1
(nota:sin unirse, por ahora)Estas consultas son muy rápidas y se ejecutan en un tiempo prácticamente independiente del tamaño de la tabla.
Esto debería ser mucho más rápido que ORDER BY RAND()
.
Ahora, para obtener una Imagen aleatoria para cada Producto aleatorio:
SELECT *
FROM (
SELECT *
FROM Products
OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON pi.product_id = p.id
ORDER BY RAND()
LIMIT 1
La consulta interna aún es rápida, y la externa solo ordena unas pocas filas (suponiendo que haya pocas imágenes por producto), por lo que aún puede usar order by rand().