Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL sélectionne une ligne aléatoire avec JOIN à partir de deux tables

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