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

MySQL 5.7 RAND() et IF() sans LIMIT conduisent à des résultats inattendus

Le problème est causé par un changement introduit dans MySQL 5.7 sur la façon dont les tables dérivées dans les (sous-)requêtes sont traitées.
Fondamentalement, afin d'optimiser les performances, certaines sous-requêtes sont exécutées à des moments différents et/ou à plusieurs reprises, ce qui entraîne des résultats lorsque votre sous-requête renvoie des résultats non déterministes (comme dans mon cas avec RAND() ).
Il existe deux solutions de contournement simples (et tout aussi moches) pour que MySQL "matérialise" (c'est-à-dire renvoie des résultats déterministes) ces sous-requêtes :utilisez LIMIT <high number> ou GROUP BY id qui forcent MySQL à matérialiser la sous-requête et à renvoyer les résultats attendus.
La dernière option est de désactiver derived_merge dans le optimizer_switch variable :derived_merge=off (assurez-vous de laisser tous les autres paramètres tels quels).

Lectures complémentaires :
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
La colonne rand() de la sous-requête est réévaluée pour chaque sélection répétée dans MySQL 5.7/8.0 par rapport à MySQL 5.6