Best-practice-Frage für MySQL: order by id oder Datum?
Dies ist ein noobish Frage, aber ich habe nie eine klare Antwort auf.
Angenommen ich habe eine DB-Tabelle mit folgenden Felder und Werte:
| id | date_added | balance |
+------------------------------------+
| 1 | 2009-12-01 19:43:22 | 1237.50 |
| 2 | 2010-01-12 03:19:54 | 473.00 |
| 3 | 2010-01-12 03:19:54 | 2131.20 |
| 4 | 2010-01-20 11:27:31 | 3238.10 |
| 5 | 2010-01-25 22:52:07 | 569.40 |
+------------------------------------+
Dies ist für eine sehr einfache 'Rechnungswesen' sub-system. Ich möchte die jüngste Bilanz. Die id
Bereich ist auf auto_increment. Normalerweise würde ich verwenden:
SELECT balance FROM my_table ORDER BY date_added DESC LIMIT 1;
Aber ich brauche, um absolut sicher, dass der zurückgegebene Wert ist der jüngste... (siehe id# 2 & 3 oben)
1) Wäre ich besser dran mit:
SELECT balance FROM my_table ORDER BY id DESC LIMIT 1;
2) Oder wäre das eine bessere Lösung?:
SELECT balance FROM my_table ORDER BY date_added,id DESC LIMIT 1;
AFAIK auto_increment
funktioniert Recht gut, aber ist es zuverlässig genug, um zu Sortieren, etwas, das entscheidend durch? Das ist, warum ich ' m denken, die Sortierung, die von beiden Bereichen ist eine bessere Idee, aber ich habe gesehen, einige wirklich skurrile Verhalten in MySQL, wenn ich das in der Vergangenheit getan. Oder wenn es eine noch bessere Lösung, ich würde schätzen Ihre Eingabe.
Vielen Dank im Voraus!
Brian
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es ist eine chance, die Sie bekommen zwei Hinzugefügt, die mit demselben Datum, werden Sie wahrscheinlich benötigen:
(Hinweis: 'absteigend' - Klausel auf beiden Feldern).
Jedoch, müssen Sie berücksichtigen, was Sie wollen passieren, wenn jemand einen anpassen Eintrag die 2nd Februar, die das Datum 31st Januar, um sicherzustellen, der Monat Januar ist abgeschlossen. Es wird mit einer ID größer als diejenigen, auf die 1st Februar.
Allgemein, Rechnungswesen arbeiten, nur auf das Datum. Vielleicht, wenn Sie uns mitteilen könnten warum die Reihenfolge ist wichtig, wir könnten auch andere Vorschläge.
In Antwort auf Ihren Kommentar:
Ich würde ein paar Stücke von Beratung - das ist alles, ich denken konnte, sofort, ich in der Regel speien her viel mehr "Beratung" mit noch weniger Mut 🙂 Die ersten zwei, mehr im Zusammenhang mit der Datenbank als accounting-relared, sind:
Zunächst nicht alles in der Dritten Normalform, und nur zurückkehren, wenn und wenn Sie haben performance-Probleme. So sparen Sie eine Menge angst mit doppelten Daten, die dann eventuell aus dem tritt. Selbst wenn Sie zurückkehren, der Einsatz von Triggern und anderen DBMS-Funktionen, um sicherzustellen, dass die Daten nicht aus dem tritt.
Beispiel, wenn Sie möchten, um Ihre Suche zu beschleunigen, die auf eine last_name-Spalte können Sie eine upper_last_name Spalte (indexiert) verwenden Sie dann, dass zum suchen von Datensätzen, passend zu Ihrem bereits upper-cased Suchbegriff. Das wird fast immer schneller sein als die pro-Zeile-Funktion
upper(last_name)
. Sie können verwenden Sie eine insert - /update-trigger, um sicherzustellen, die upper_last_name ist immer richtig eingestellt und dadurch entstehen die Kosten nur, wenn der name geändert wird, nicht jedes mal, wenn Sie suchen.Zweitens, nicht doppelte Daten auch über Tabellen (wie Ihre aktuelle schema), es sei denn, Sie verwenden können, die gleichen trigger-Typ-tricks garantieren die Daten nicht aus dem tritt. Was wird der Kunde tun, wenn Sie Sie senden eine Rechnung, wo der Endbetrag nicht mit dem Startguthaben plus kauft? Das ist nicht zu machen Ihr Unternehmen sehr Professionell Aussehen 🙂
Drittens (und das ist mehr rechnungslegungsbezogenen), die Sie in der Regel nicht brauchen, um über die Anzahl der Transaktionen bei der Berechnung der Salden auf das Fliegen. Das ist, weil die accounting-Systeme haben in der Regel eine roll-over-Funktion am Ende des Geschäftsjahres, das setzt die Eröffnungsbilanzen.
So sind Sie in der Regel nie mit mehr als einem Jahr im Wert von Daten auf einmal, die, wenn Sie die US-Regierung oder Microsoft, ist nicht so belastend.
Vielleicht schneller durch die id, aber sicherer, von datetime; letztere verwenden, wenn performance-Problemen, um einen index hinzuzufügen.
Würde ich persönlich nie Vertrauen ein autoincrement auf diese Weise. Ich würde Sortieren nach dem Datum.
Ich bin mir ziemlich sicher, dass die ID garantiert eindeutig sein, aber nicht notwendigerweise sequenziellen und steigt.