Optimisation des commandes MySQL RAND()
Les requêtes lentes mettant en vedette ORDER BY RAND() présentent un défi de performances.
Le problème
Les requêtes avec ORDER BY RAND() entraînent souvent performances sous-optimales, en particulier sur les tables volumineuses ou fréquemment mises à jour. La solution de MySQL (MySQLPerformanceBlog) peut être insuffisante.
La solution
Pour optimiser l'ordre RAND(), envisagez l'approche suivante :
SELECT * FROM ( SELECT @cnt := COUNT(*) + 1, @lim := 10 FROM t_random ) vars STRAIGHT_JOIN ( SELECT r.*, @lim := @lim - 1 FROM t_random r WHERE (@cnt := @cnt - 1) AND RAND(20090301) < @lim / @cnt ) i
Cette approche évite le tri en maintenant la probabilité d'exécution lors de l'itération des données, ce qui la rend plus efficace que ORDER BY. RAND().
Pour la sélection sur une seule ligne
Pour sélectionner une seule ligne aléatoire, essayez cette requête :
SELECT aco.* FROM ( SELECT minid + FLOOR((maxid - minid) * RAND()) AS randid FROM ( SELECT MAX(ac_id) AS maxid, MIN(ac_id) AS minid FROM accomodation ) q ) q2 JOIN accomodation aco ON aco.ac_id = COALESCE ( ( SELECT accomodation.ac_id FROM accomodation WHERE ac_id > randid AND ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ), ( SELECT accomodation.ac_id FROM accomodation WHERE ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ) )
Cette optimisation suppose que les ac_ids sont répartis de manière relativement uniforme.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!