C'est le tri qui vous ralentit. Plutôt que de trier au hasard, sélectionnez simplement un product_db.unique_id
aléatoire
Dans votre requête, remplacez ORDER BY RAND()
avec :
AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db))
en utilisant >=
au lieu de =
dans le cas où unique_id a été supprimé de la base de données. Pas un résultat aussi aléatoire que la commande par rand, mais la requête s'exécutera beaucoup plus rapidement. Si vous le souhaitez, vous pouvez exécuter plusieurs requêtes avec =
jusqu'à ce qu'un résultat soit trouvé et cela peut encore être assez rapide que de trier tous ces résultats.
Avec un JOIN explicite, ce serait :
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