Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die rand()-Spalte der Unterabfrage wurde für jede wiederholte Auswahl in MySQL 5.7/8.0 im Vergleich zu MySQL 5.6 neu ausgewertet

Wie in The MySQL 8.0.0 Milestone Release erwähnt ist verfügbar ,

Ich nehme an, dass dies die Ursache für das Verhalten ist, das ich in neueren Versionen von MySQL beobachte. Der erwähnte Hinweis kann mit MySQL 8.0 verwendet werden, um zu erzwingen, dass RAND() nur einmal aufgerufen wird:

SELECT  /* NO_MERGE(q) */
        q.i,
        q.r,
        q.r
FROM    (
        SELECT 
                id AS i,
                (FLOOR(RAND(100) * 4)) AS r
        FROM t
        ) AS q;

+---+-----+-----+
| i |  r  |  r  |
+---+-----+-----+
| 1 |   0 |   0 |
| 2 |   2 |   2 |
| 3 |   3 |   3 |
| 4 |   2 |   2 |
| 5 |   1 |   1 |
+---+-----+-----+

Dies ist jedoch in 5.7 nicht verfügbar. Um das gewünschte Verhalten mit 5.7 zu erreichen, fügen Sie LIMIT <a very high number> hinzu zur abgeleiteten Tabellendefinition (ich verwende unten signiertes LONG_MAX). Danke an Roy Lyseng für diesen Workaround .

SELECT
        q.i,
        q.r,
        q.r
FROM    (
        SELECT 
                id AS i,
                (FLOOR(RAND(100) * 4)) AS r
        FROM t LIMIT 9223372036854775807
        ) AS q;

+---+-----+-----+
| i |  r  |  r  |
+---+-----+-----+
| 1 |   0 |   0 |
| 2 |   2 |   2 |
| 3 |   3 |   3 |
| 4 |   2 |   2 |
| 5 |   1 |   1 |
+---+-----+-----+

Als Philippy Im Kommentar erwähnt, muss das Ergebnis eines Abfrageausdrucks unabhängig von angewendeten Optimierungen streng definiert sein. Das bedeutet, dass es sich um einen Optimierungsfehler in MySQL 5.7/8.0 handelt.