Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL 5.7 RAND() и IF() без LIMIT води до неочаквани резултати

Проблемът е причинен от промяна, въведена в MySQL 5.7 относно това как се третират извлечените таблици в (под)заявките.
По принцип, за да се оптимизира производителността, някои подзаявки се изпълняват по различно време и/или няколко пъти, което води до неочаквани резултати, когато вашата подзаявка връща недетерминирани резултати (като в моя случай с RAND() ).
Има две лесни (и по същия начин грозни) решения, за да накарате MySQL да „материализира“ (известни още като връщане на детерминирани резултати) тези подзаявки:Използвайте LIMIT <high number> или GROUP BY id и двете принуждават MySQL да материализира подзаявката и да връща очакваните резултати.
Последната опция е изключване на derived_merge в optimizer_switch променлива:derived_merge=off (уверете се, че сте оставили всички останали параметри такива, каквито са).

Допълнителна информация:
https://mysqlserverteam.com/derived -tables-in-mysql-5-7/
Колоната rand() на подзаявката е преоценена за всеки повторен избор в MySQL 5.7/8.0 срещу MySQL 5.6




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Немски умлаути в MYSQL INSERT

  2. Създайте Optgroup от масив от данни

  3. MySql предоставя потребителско разрешение

  4. PDO клас на свързване / код и дизайн на клас

  5. Изберете с помощта на динамично генерирано име на таблица