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

Was ist der effizienteste Weg, um eine Sortierreihenfolge für eine Gruppe von Datensätzen in einer Datenbank zu speichern?

Wie wäre es, wenn Sie einfach eine integer verwenden Spalte, die die Reihenfolge definiert? Standardmäßig weisen Sie Nummern * 1000 zu, wie 1000, 2000, 3000 .... und wenn Sie 3000 zwischen 1000 und 2000 verschieben, ändern Sie sie in 1500. In den meisten Fällen müssen Sie die anderen Nummern also überhaupt nicht aktualisieren. Ich benutze diesen Ansatz und es funktioniert gut. Sie können auch double verwenden aber dann haben Sie keine Kontrolle über die Genauigkeit und Rundungsfehler, also verwenden Sie es lieber nicht.

So würde der Algorithmus aussehen :Angenommen, Sie verschieben B an die Position nach A. Führen Sie zuerst select aus, um die Reihenfolge des Datensatzes neben A anzuzeigen. Wenn sie mindestens +2 höher ist als die Reihenfolge von A, dann legen Sie einfach die Reihenfolge von B so fest, dass sie dazwischen passt. Aber wenn es nur +1 höher ist (es gibt kein Leerzeichen nach A), wählen Sie die angrenzenden Datensätze von B aus, um zu sehen, wie viel Platz auf dieser Seite ist, dividieren Sie durch 2 und addieren Sie diesen Wert dann zur Reihenfolge aller Datensätze zwischen A und B. Das ist es!

(Beachten Sie, dass Sie Transaktionen/Sperren für jeden Algorithmus verwenden sollten, der mehr als eine einzelne Abfrage enthält, also gilt dies auch für diesen Fall. Der einfachste Weg ist die Verwendung von InnoDB-Transaktionen.)