sql >> Databáze >  >> RDS >> Mysql

MySQL 5.7 RAND() a IF() bez LIMIT vede k neočekávaným výsledkům

Problém je způsoben změnou zavedenou v MySQL 5.7 v tom, jak se zachází s odvozenými tabulkami v (pod)dotazech.
V zásadě se za účelem optimalizace výkonu některé poddotazy spouštějí v různých časech a/nebo vícekrát, což vede k neočekávaným výsledky, když váš poddotaz vrátí nedeterministické výsledky (jako v mém případě s RAND() ).
Existují dvě snadná (a také ošklivá) řešení, jak přimět MySQL k „materializaci“ (neboli návratu deterministických výsledků) těchto poddotazů:Použijte LIMIT <high number> nebo GROUP BY id oba nutí MySQL zhmotnit poddotaz a vrátit očekávané výsledky.
Poslední možností je vypnout derived_merge v optimizer_switch proměnná:derived_merge=off (nezapomeňte ponechat všechny ostatní parametry tak, jak jsou).

Další informace:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Sloupec rand() poddotazu byl přehodnocen pro každý opakovaný výběr v MySQL 5.7/8.0 vs MySQL 5.6




  1. Implementace vlastního řazení

  2. Co by měl vědět každý PHP programátor?

  3. Operátoři sady Oracle

  4. Nezanedbatelný rozdíl v prováděcím plánu oproti Oracle při použití jdbc Timestamp nebo Date