Maison >base de données >tutoriel mysql >Comment puis-je optimiser ORDER BY RAND() de MySQL pour de meilleures performances ?
Optimisation des performances ORDER BY RAND() de MySQL
Lors de l'optimisation des requêtes MySQL, le traitement des requêtes lentes contenant la fonction ORDER BY RAND() peut être stimulant. Cet article explore des solutions efficaces pour améliorer les performances de ces requêtes.
Une approche courante consiste à utiliser une sous-requête qui calcule le classement de chaque ligne en fonction d'une valeur aléatoire. Cela permet une sélection efficace de lignes aléatoires sans nécessiter de tri réel.
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 méthode est particulièrement efficace pour les tables MyISAM, mais offre également des améliorations significatives des performances dans InnoDB.
Pour la sélection d'un enregistrement aléatoire unique, une approche alternative peut être utilisée :
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 approche suppose une distribution relativement uniforme des valeurs ac_id. En utilisant ces techniques, vous pouvez optimiser considérablement les requêtes MySQL impliquant ORDER BY RAND().
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!