Les meilleures pratiques de question pour MySQL: order by id ou la date?
C'est une sorte de noobish question, mais c'est celui que je n'ai jamais été donné un droit de réponse.
Supposons que j'ai une DB table avec les champs suivants et de valeurs:
| 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 |
+------------------------------------+
C'est très de base "comptables" sous-système. Je veux obtenir la plus récente de la balance. Le id
champ est de type auto_increment. En règle générale, je voudrais utiliser:
SELECT balance FROM my_table ORDER BY date_added DESC LIMIT 1;
Mais j'ai besoin de faire absolument sûr que la valeur retournée est la plus récente... (voir id# 2 & 3 ci-dessus)
1) je serais mieux de les utiliser:
SELECT balance FROM my_table ORDER BY id DESC LIMIT 1;
2) Ou serait-ce une meilleure solution?:
SELECT balance FROM my_table ORDER BY date_added,id DESC LIMIT 1;
Autant que je sache, auto_increment
fonctionne assez bien, mais est-il suffisamment fiable pour trier quelque chose d'essentiel? C'est pourquoi je pense tri par deux champs est une meilleure idée, mais j'ai vu des vraiment bizarre le comportement de MySQL, quand je l'ai fait dans le passé. Ou si il y a une solution encore meilleure, je vous remercie de votre entrée.
Merci d'avance!
Brian
OriginalL'auteur DondeEstaMiCulo | 2010-01-30
Vous devez vous connecter pour publier un commentaire.
Si il y est une chance que vous aurez ajouté deux avec la même date, vous aurez probablement besoin:
(notez le "descendant" de la clause sur les deux champs).
Toutefois, vous aurez besoin de prendre en compte ce que vous voulez arriver, lorsque quelqu'un ajoute un réglage de l'entrée de la 2ème de février qui est donné à la date du 31st de janvier à garantir le mois de janvier est terminé. Il aura un ID supérieur à ceux réalisés sur le 1st de février.
Généralement, les systèmes de comptabilité simplement travailler sur la date. Peut-être si vous pouviez nous en dire pourquoi l'ordre est important, nous pourrions faire d'autres suggestions.
En réponse à votre commentaire:
Je voudrais fournir quelques morceaux de conseils - c'est tout ce que je pouvais penser immédiatement, j'ai l'habitude de jaillir beaucoup plus de "conseils" avec encore moins d'encouragements 🙂 Les deux premiers, plus liés aux bases de données comptables,-relared, sont:
Tout d'abord, ne tout en troisième forme normale et seulement revenir si et quand vous avez des problèmes de performances. Cela vous permettra d'économiser beaucoup d'angoisse avec des doublons de données, qui peut passer de l'étape. Même si vous ne faites revenir, à l'utilisation de déclencheurs et d'autres SGBD capacités à s'assurer que les données n'est pas sorti de l'étape.
Un exemple, si vous voulez accélérer vos recherches sur un nom de colonne, vous pouvez créer un upper_last_name colonne (indexée) ensuite l'utiliser pour localiser les enregistrements correspondant à votre supérieur-est enfermé terme de recherche. Ce sera presque toujours plus rapide que la fonction ligne
upper(last_name)
. Vous pouvez utiliser un insert/déclencheur de mise à jour pour assurer la upper_last_name est toujours réglé correctement et ce qui assume le coût que lorsque les changements de nom, pas à chaque fois que vous effectuez une recherche.Deuxièmement, ne pas dupliquer les données, même dans les tableaux (comme votre schéma actuel), sauf si vous pouvez utiliser ces mêmes déclenchement-type astuces afin de garantir que les données ne veut pas sortir de l'étape. Qu'est ce que votre client n'lorsque vous envoyez une facture dans les cas où le solde final ne correspond pas à la solde de départ plus des achats? Cela ne va pas rendre votre entreprise look très professionnel 🙂
Troisièmement (et c'est plus liées à la comptabilité), vous n'avez généralement pas besoin de s'inquiéter à propos du nombre de transactions lors de l'établissement des soldes à la volée. C'est parce que les systèmes de comptabilité ont généralement un roll-over à la fin de l'année qui réinitialise les soldes d'ouverture.
De sorte que vous êtes généralement jamais avoir à traiter plus d'une année de données à la fois, à moins que vous êtes le gouvernement AMÉRICAIN ou de Microsoft, n'est pas onéreux.
Hmm, ce n'est pas la façon dont je le ferais mais à chacun son propre 🙂 j'aimerais calculer l'équilibre de l'ensemble de leurs entrées de transaction (ma préférence car il n'y a aucun chance des données de sortir de l'étape entre les deux tables), ou simplement de maintenir enregistrer pour chaque utilisateur avec la balance courante et de les mettre à jour. En fait, je ne peux pas me résoudre à recommander la seconde option à tous, maintenant que j'y pense. Vous devez être prudent avec votre solution actuelle, car vous êtes en possession de données à deux endroits différents qui peuvent être en désaccord les uns avec les autres.
Eh bien, nous aimerions garder l'équilibre dans l'histoire, si rien d'autre, mais interne à des fins de reporting. J'avais effectivement pensé à votre idée de calcul de l'ensemble des transactions que bien, mais pensé de la manière ci-dessus pourrait être plus facile. Je vais peut-être re-pense que cette idée. 😉 J'aimerais entendre d'autres idées ou des conseils que vous pourriez avoir, même si elles sont hors-sujet, car je n'ai aucune connaissance de la comptabilité-type de modèles de base de données. 😉 Merci encore!
Conseils Awesome! Je n'avais même pas pensé à certains de ces points que vous venez de faire. Je vous remercie beaucoup. Je pense que je vais faire de certains de ces changements dès maintenant. 😉
Que diriez-tri par code au lieu de timestamp, est-il dangereux?
OriginalL'auteur paxdiablo
Est peut-être plus rapide par id, mais plus sûr par datetime; utiliser ce dernier, si vous avez des problèmes de performances d'ajouter un index.
OriginalL'auteur Alex LE
Personnellement je n'avais jamais confiance à un autoincrement. Je voudrais trier par date.
Je suis assez sûr que l'ID est unique, mais pas nécessairement séquentiel et en augmentation.
OriginalL'auteur MikeW