2016-04-14 7 views
1

Ich habe bemerkt, dass die folgende AbfrageMysql Tabelle anders mit derselben Reihenfolge von Klausel bestellt

SELECT * FROM 'mytable' ORDER BY 'myfield' 

sehr unterschiedlich geordnete Tabelle erzeugt zu

SELECT id FROM 'mytable' ORDER BY 'myfield' 

Das Feld, das ich bin die Bestellung ein Datum Feld und für 50% der Datensätze ist der Wert null. Auch wenn ich in meiner SELECT-Klausel jedes der Felder benenne, anstatt auf * angewiesen zu sein, erreicht es die gleiche Reihenfolge wie die zweite obige Abfrage.

Kann mir bitte jemand mitteilen, warum dies geschieht und was ich tun kann, um eine beständige Bestellung zu erhalten?

Antwort

3

Ohne eine zweite Ebene der Bestellung erscheinen die Nullsätze in beliebiger Reihenfolge, die der Motor wünscht ... Wahrscheinlich die Reihenfolge des Index auf ID, oder ein zusammengesetzter Index mit Datum. Wenn Sie nach dem Datumsfeld eine konsistente Reihenfolge wünschen, dann den Primärschlüssel der Tabelle. Wenn kein Primärschlüssel vorhanden ist, müssen Sie nach allen Spalten sortieren, die einen Datensatz eindeutig machen würden.

So ..

SELECT id FROM `mytable` ORDER BY `myfield`, `PK` 

vs

SELECT * FROM `mytable` ORDER BY `myfield`, `PK` 

in der gleichen Reihenfolge führen.

+0

Bestellung von * zwei * String-Literale wird nicht viel Unterschied machen. – spencer7593

+0

@ spencer7593 ja, ich stimme zu, aber myfield und pk waren "Platzhalter" für die tatsächlichen Feldnamen, die nicht als Literale gedacht waren. also MyField und PK und MyTable seit der Syntax ist dies UNGÜLTIG, wenn meine Tabelle in Ticks ist. – xQbert

+0

Wenn die Bezeichner einfache Anführungszeichen enthielten, konnten sie mit Escapezeichen versehen werden, indem sie in Backticks eingeschlossen wurden. ** 'SELECT ID FROM \' 'MeinTabelle' \ 'ORDER BY \ '' MeinFeld '\', \ '' PK ' \ "' **. – spencer7593

0

Es sieht so aus, als ob Sie nach einem String-Literal sortieren. Was ist los mit den einfachen Anführungszeichen um 'myfield'? Bei einem Zeichenfolgenliteral wird derselbe genaue Wert jeder Zeile zugewiesen, die zurückgegeben wird. Und MySQL kann Zeilen in beliebiger Reihenfolge zurückgeben. Es gibt keine Reihenfolge, die das ORDER BY-Zeichenfolgenliteral verletzen würde. Ich wäre nicht überrascht, wenn der Optimierer einfach eine bedeutungslose ORDER BY-Klausel verwirft.


In MySQL können Kennungen durch Einschließen in Backticks ausgeblendet werden. Auf meinen Tastaturen ist das der `~ Schlüssel oben links, gleich links von der 1! Schlüssel.

Einfache Anführungszeichen umschließen ein String-Literal.

(... eine Diskussion über doppelte Anführungszeichen und ANSI_QUOTES in sql_mode Umgehung ...)


Was diese Abfrage Rückkehr tut?

Auf meinem System erhalte ich 50 Kopien der gleichen Zeichenfolge. Wenn ich den Tabellennamen in einfache Anführungszeichen setze, erhalte ich einen Syntaxfehler.

Das Zeichenfolgenliteral funktioniert genauso in der ORDER BY-Klausel ... in jeder Zeile wird derselbe Zeichenfolgenwert angezeigt.

Der Unterschied in der Reihenfolge, die Sie beobachten, ist wahrscheinlich auf einen anderen Zugriffsplan zurückzuführen. Der Abruf einer Spalte kann einen Index verwenden, der Abruf aller Spalten ist wahrscheinlich ein vollständiger Scan der Tabelle.


Wenn Ihre Abfrage nicht einfache Anführungszeichen verwenden, dann wenden Sie sich bitte die genaue Abfrage zu schreiben, die Sie ausführen.

Verwandte Themen