Mit der gleichen Datenbankstruktur und Daten auf MySQL 5.6.34 (mein neuer Entwicklerserver) und MariaDB 10.2.8 (mein neuer Produktionsserver, wo ich dachte, dass ich den Code heute endlich bereitstellen würde - Seufz!), MySQL funktioniert und MariaDB ist nicht. Dies ist Code, der seit Jahren mit MySQL 5.0.95 funktioniert. Ich habe meine Abfrage auf das minimale Beispiel vereinfacht, das das Problem zeigt - es scheint, dass GROUP_CONCAT()
und Unterabfragen nicht mischen. Hier ist die Abfrage:MariaDB: group_concat mit Unterabfrage fehlgeschlagen
SELECT person.PersonID,
GROUP_CONCAT(CategoryID ORDER BY CategoryID SEPARATOR ',') AS categories
FROM person LEFT JOIN percat ON person.PersonID=percat.PersonID
WHERE person.PersonID IN (SELECT PersonID FROM action WHERE ActionTypeID=3)
GROUP BY person.PersonID
Und hier ist ein zusammengesetztes Bild von Screenshots, die die Struktur aller drei Tabellen beteiligt:
auf MySQL, es funktioniert gut, wie es funktioniert hat jahrelang. Hier ist das Ergebnis und EXPLAIN
:
Und das ist das verrückt Ergebnis, das ich auf MariaDB erhalten:
Ich weiß nicht, das Innenleben des DB-Motors gut genug zu folgen EXPLAIN
, aber ich nehme an, dass der Hinweis irgendwo dort ist. Ich fand das klingt verwandt, aber ich verstehe nicht wirklich, was sie darüber sagen, und was noch wichtiger ist, was ich dagegen tun sollte.
Ich kann nicht scheinen, wenn ausgeschaltet - anscheinend mache ich es falsch. In '/ etc/my.cnf', Sektion' [mysqld] ', fügte ich' optimizer_switch = orderby_uses_equalisities = off' hinzu (ich probierte es mit und ohne Hochkommas - ich sah Beispiele im Web von beiden) und startete mysqld neu (was hat auch seltsames Verhalten - es gibt meine ssh-Eingabeaufforderung nicht zurück, bis ich nach dem Warten auf^C drücke. Aber "SELECT @@ optimizer_switch \ G" sagt, dass "orderby_uses_equalities" noch an ist, und es gibt keine Änderung im Abfrageverhalten. – OsakaWebbie
Der Abschnitt und die Linie sind in Ordnung. Überprüfen Sie zunächst, ob Ihr Server tatsächlich neu gestartet wird (z. B. durch Überprüfen von 'STATUS LIKE' Uptime'und/oder des Fehlerprotokolls). Es hört sich so an, als ob der Server nicht wirklich herunterfährt, dann neu startet und um das Datenverzeichnis kämpft , z.B für die Sperre über Aria-Steuerdatei oder dergleichen. Wenn der Server tatsächlich neu gestartet wird, besteht der andere mögliche Grund darin, dass diese CNF-Datei nicht von Ihrer Installation verwendet wird. Sie können etwas nach dem optimizer_switch, z. 'lock_wait_timeout = 42' (oder was auch immer Sie erkennen würden), und sehen Sie, ob es abgeholt wird. – elenst
Yup, das war es - es hatte nicht wirklich neu gestartet (ich habe den Befehl falsch gemacht). Ihr Workaround funktioniert wie ein Zauber! Wenn ich mehr Zeit habe, werde ich daran arbeiten, meinen Code zu vereinfachen, aber im Moment kann ich dank Ihnen den neuen Server hochfahren. – OsakaWebbie