2009-04-07 19 views
17

Angenommen, die Standardreihenfolge einer MySQL-Tabelle (ISAM) durch die Ausführung geändert wird:Standardsortierreihenfolge in MySQL (ALTER TABLE ... ORDER BY ...;)

ALTER TABLE tablename ORDER BY columnname ASC; 

Fortan , bin ich garantiert, um Datensätze abgerufen aus der Tabelle in der Reihenfolge von "Spaltenname ASC" vorausgesetzt, keine "ORDER BY" ist in meinen Abfragen angegeben (zB "SELECT * FROM Tabellenname WHERE ... LIMIT 10;")?

Gibt es irgendwelche Eckfälle, die ich beachten sollte?

Update # 1: Vielen Dank an Quassnoi, der richtig darauf hingewiesen hat, dass INSERTs und DELETEs die Reihenfolge durcheinander bringen. Dies führt mich zu folgenden zusätzlichen Fragen:

  • Was ist mit UPDATEs? Angenommen, es werden keine INSERTs oder DELETEs an die Tabelle vorgenommen, sondern nur Aktualisierungen - ist die Sortierreihenfolge intakt?
  • Angenommen, INSERTs und DELETEs werden gemacht - wie kann ich die Sortierung wieder aufbauen, sagen wir einmal am Tag (in diesem speziellen Fall ändert sich die Tabelle nur täglich, also sollte sie täglich nach den Änderungen neu aufgebaut werden!)). Repariert REPARATUR TABELLE oder muss ALTER TABLE ... ORDER BY erneut hinzugefügt werden?

Antwort

24

Von documentation:

Beachten Sie, dass die Tabelle nicht nach Einsätzen in dieser Reihenfolge bleibt und löscht

Eigentlich, wenn Sie SELECT ... ORDER BY auf diese Tabelle, um die Option zu ALTER TABLE won Ausgabe 't verschone dich von filesort, aber mache statt filesort viel schneller.

Das Sortieren eines bereits geordneten Sets entspricht dem Durchsuchen dieses Sets, um sicherzustellen, dass alles in Ordnung ist.

Was ist mit UPDATEs? Angenommen, es werden keine INSERTs oder DELETEs an die Tabelle vorgenommen, sondern nur Aktualisierungen - ist die Sortierreihenfolge intakt?

Wenn Ihre Tabelle enthält keine dynamischen Felder (wie VARCHAR oder ‚BLOB‘), dann höchstwahrscheinlichMyISAM wird es nicht bewegen, wenn die Aktualisierung.

Ich würde mich jedoch nicht auf dieses Verhalten verlassen, wenn ich ein Atomkraftwerk bauen würde oder etwas, für das ich bezahlt werde.

Angenommen, Einfügungen und Löschungen vorgenommen werden - wie kann ich „Wiederaufbau“ der wieder sortieren, sagen einmal pro Tag (in diesem speziellen Fall die Tabelle täglich ändert sich nur, so dass er täglich den Wiederaufbau, nachdem die Änderungen vorgenommen werden sollten immer noch OK!). Repariert REPARATUR TABELLE oder muss ALTER TABLE ... ORDER BY erneut hinzugefügt werden?

Sie müssen ALTER TABLE ... ORDER BY tun.

REPAIR behebt nur die physische Struktur einer beschädigten Tabelle.

+0

Vielen Dank für Ihre schnelle Antwort. Ich habe zwei weitere Fragen hinzugefügt, die sich auf Ihre Antworten beziehen. – knorv

+0

@Quassnoi Ich habe ALTER TABLE ... ORDER BY und dann einige Datensätze gelöscht, meine Tabelle nicht massiert ..? Warum das? – Basit

+0

@Basit: Ich weiß nicht – Quassnoi

-1

Die standardmäßige Sortierung scheint ein Versuch zu sein, faul zu sein, der am Ende viele Kopfschmerzen auf der Straße verursacht. Ich würde es überhaupt nicht anfassen und würde nur sicherstellen, Order in meinen Abfragen anzugeben.

+12

War meine Frage in irgendeiner Weise unterspezifiziert? Ich verstehe nicht, wie Ihr Beitrag eine Antwort auf die sehr spezifische Frage sein könnte. – knorv

+2

sei nicht unhöflich, er wollte nur helfen !, im allgemeinen zu sprechen, ist sein Vorschlag nicht gültig? – dennisbot

3

Wenn Sie eine Spalte physisch anordnen, können Sie eine Menge IO speichern. Es ist eine vollkommen legitime Methode, die in fortgeschrittenen Systemen verwendet wird, um die Abfragezeit zu beschleunigen. Sie müssen nur die Daten von Zeit zu Zeit reorganisieren, damit sie in Clustern bleiben. Nur weil einige Leute noch nicht davon gehört haben, heißt das nicht, dass es sie nicht gibt. - 25 Jahre fortgeschrittener DB Design Veteran.