Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL 5.7 RAND() e IF() sem LIMIT leva a resultados inesperados


O problema é causado por uma mudança introduzida no MySQL 5.7 sobre como as tabelas derivadas em (sub)consultas são tratadas.
Basicamente, para otimizar o desempenho, algumas subconsultas são executadas em momentos diferentes e/ou várias vezes levando a resultados inesperados. resultados quando sua subconsulta retorna resultados não determinísticos (como no meu caso com RAND() ).
Existem duas soluções fáceis (e igualmente feias) para fazer o MySQL "materializar" (também conhecido como retornar resultados determinísticos) essas subconsultas:Use LIMIT <high number> ou GROUP BY id ambos forçam o MySQL a materializar a subconsulta e retornar os resultados esperados.
A última opção é desativar derived_merge no optimizer_switch variável:derived_merge=off (certifique-se de deixar todos os outros parâmetros como estão).

Outras leituras:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Coluna rand() da subconsulta reavaliada para cada seleção repetida no MySQL 5.7/8.0 vs MySQL 5.6