Es la clasificación lo que te está ralentizando. En lugar de ordenar al azar, simplemente seleccione un product_db.unique_id
aleatorio.
En su consulta, reemplace ORDER BY RAND()
con:
AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db))
usando >=
en lugar de =
en caso de que unique_id se haya eliminado de la base de datos. No es un resultado tan aleatorio como ordenar por rand, pero la consulta se ejecutará mucho más rápido. Si lo desea, puede ejecutar múltiples consultas con =
hasta que se encuentre un resultado y todavía puede ser bastante más rápido que ordenar todos esos resultados.
Con un JOIN explícito sería:
SELECT product_db.image
FROM product_db
JOIN product_page ON product_db.unique_id = product_page.product_unique_id
WHERE product_page.page_id = 3
AND product_db.status = 'Online'
AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db))
LIMIT 1