Gibt es einen Leistungsunterschied zwischen decimal(10,0) unsigned
Typ und int(10) unsigned
Typ?Dezimal VS Int in MySQL?
Antwort
Es hängt möglicherweise von der Version von MySQL ab, die Sie verwenden. Siehe here.
Vor MySQL 5.0.3 wurde der DECIMAL-Typ als String gespeichert und in der Regel langsamer sein würde. Da jedoch seit MySQL 5.0.3 der DECIMAL-Typ in einem binären Format gespeichert ist, ist die Leistung Ihres DECIMAL möglicherweise nicht sehr unterschiedlich.
Das Hauptleistungsproblem des Platzes durch die verschiedenen Arten aufgenommen (mit DECIMAL langsamer ist) gewesen wäre. Mit MySQL 5.0.3+ scheint dies weniger ein Problem zu sein. Wenn Sie jedoch numerische Berechnungen für die Werte als Teil der Abfrage ausführen, kann es zu Leistungseinbußen kommen. Dies kann sich lohnen, da es in der Dokumentation keine Hinweise gibt, die ich sehen kann.
Edit: In Bezug auf die int(10) unsigned
, ich nahm dies zum Nennwert als nur ein 4-Byte-int zu sein. Dies hat jedoch einen maximalen Wert von 4294967295, der streng genommen nicht den gleichen Zahlenbereich wie DECIMAL(10,0) unsigned
bietet.
Wie @Unreason darauf hingewiesen hat, müssten Sie einen bigint
verwenden, um den vollen Bereich der 10-stelligen Zahlen abzudecken, was die Größe auf bis zu 8 Bytes erhöht.
Ein häufiger Fehler ist, dass, wenn numerische Spalten Typen in MySQL spezifizieren, denken die Leute oft die Zahl in den Klammern einen Einfluss auf die Größe der Zahl hat sie speichern können. Es tut es nicht. Der Nummernkreis basiert ausschließlich auf dem Spaltentyp und darauf, ob er signiert oder unsigniert ist. Die Zahl in den Klammern dient zur Anzeige in Ergebnissen und hat keinen Einfluss auf die in der Spalte gespeicherten Werte. Es hat auch keinen Einfluss auf die Anzeige der Ergebnisse, es sei denn, Sie geben auch die ZEROFILL
Option für die Spalte an.
Also ich glaube, es wird eine sehr große Auswirkung auf eine 8 Millionen Zeilen Tabelle sein? – TheOnly92
In MySQL vor 5.1 würde Ihre Dezimalstelle etwa 10 Bytes im Vergleich zu den 4 Bytes für die Int. Daher benötigt es mehr Speicherplatz und Speicherplatz für Daten und Indizes. Wenn Ihr Server jedoch nicht kämpft, kann es bei typischen Abfragen immer noch keinen merklichen Unterschied geben. Es hängt davon ab, wie Sie es verwenden und wie die Speichernutzung ist, zusammen mit Indizes und einer Reihe anderer Dinge. –
@Jarod: Gab Ihnen +1, weil ich über diese Details nicht wusste, aber nach den angegebenen Links habe ich zwei Korrekturen - "Ab MySQL 5.0.3 werden DECIMAL und NUMERIC Werte im Binärformat gespeichert." Außerdem glaube ich, dass INT (10) BIGINT zugeordnet ist, was 8 Bytes ist. – Unreason
Ich bezweifle, dass ein solcher Unterschied überhaupt leistungsbezogen sein kann.
Die meisten Leistungsprobleme sind mit dem ordnungsgemäßen Datenbankentwurf und dem Planungsplan sowie dem Server-/Hardware-Tuning als nächste Ebene verbunden.
Nach den MySQL-Daten storage Ihre dezimal wird
DECIMAL (10,0) erfordern: 4 Byte für 9 Ziffern und 1 Byte für die restlichen 10. Stelle, also insgesamt fünf Bytes (meiner Lektüre der Dokumentation unter der Annahme, ist richtig).
INT (10): will need BIGINT die 8 Bytes ist.
Die Unterschiede bestehen darin, dass die Dezimalstelle gepackt und einige Operationen auf solchen Datentyp können auf normalen INT-Typen langsamer dann sein, die direkt abbilden zu Maschinenzahlen dargestellt.
Noch würde ich Ihre eigenen Tests machen, um die obigen Überlegungen zu bestätigen.
EDIT: Ich bemerkte, dass ich nicht auf dem offensichtlichen Punkt auszuarbeiten habe - die obige Logik unter der Annahme, klingen die Differenz erforderlich in Größe 60% mehr Platz für BIGINT Variante benötigt wird.
Allerdings bedeutet dies übersetzt nicht direkt an Strafen aufgrund der Tatsache, dass die Daten in der Regel nicht Byte für Byte geschrieben.Im Falle von Auswahlen/Aktualisierungen von vielen Zeilen sollte der Leistungsverlust/Gewinn zu sehen sein, aber im Falle der Auswahl/Aktualisierung einer kleinen Anzahl von Zeilen wird das Dateisystem Blöcke von den Platten holen, die normalerweise mehrere Spalten erhalten/schreiben .
Die Größe (und Geschwindigkeit) von Indizes ist möglicherweise direkter betroffen. Die Frage, wie die Verpackung verschiedene Operationen beeinflusst, bleibt jedoch offen.
Nach dieser ähnlichen Frage, ja, möglicherweise gibt es eine große Leistung Hit wegen Unterschied in der Art und Weise DECIMAL
und INT
behandelt werden und in die CPU Gewinde wenn Berechnungen zu tun.
See: Is there a performance hit using decimal data types (MySQL/Postgres)
- 1. Bash Multiplizieren Dezimal zu Int
- 2. Convert Int in BigDecimal mit Dezimal - Java
- 3. Konvertierung von Dezimal zu Int in C#
- 4. Ersatz int, float und dezimal mit Json.NET
- 5. Python dezimal Quantisierungsraster vs prec in Zusammenhang
- 6. JPA/MySQL Dezimal falsch angezeigt
- 7. Int32 vs. Int64 vs. Int in C#
- 8. Dezimal (5, 1) MySql Datentyp
- 9. Mysql-Dezimal: Stock statt Runde
- 10. MySQL: Größe des Dezimal-Datentyps
- 11. Int vs NSNumber vs NSInteger
- 12. Mysql in Dezimal übergeben geben 99,9
- 13. Wie konvertiere ich Int/Dezimal in float in C#?
- 14. Int vs Integer in Swift
- 15. Uninitialized Int vs Integer
- 16. System.Convert.ToInt vs (int)
- 17. Unterschiede zwischen Standard (int) vs int = 0
- 18. Wie kann ich mit reflection von int in dezimal konvertieren?
- 19. Drucken unsigned short int in hexadezimal und dezimal C
- 20. Wie zu analysieren, Hex oder Dezimal int in Python
- 21. ZK-Textfeld in ZK-Int/Dezimal-Box ändern
- 22. Typen komplex vs int
- 23. In C# sind Dezimal und Dezimal unterschiedlich?
- 24. int zu string in mysql
- 25. Unterschied zwischen Dezimal und Dezimal
- 26. mysql INT (11) Fehler
- 27. MySQL Int Definition Erklärung
- 28. Textindizes vs Ganzzahlindizes in Mysql
- 29. Java Arithmetik Int vs lange
- 30. Int Dezimal-Umwandlung - Insert Dezimalpunkt an der angegebenen Stelle
Leistungsdifferenz auf Nutzung und Mächtigkeit hängt, können Sie die typische Anzahl der Zeilen angeben, wird ein Bedarf für Index für eine Spalte (starke Beanspruchung in beitritt oder in denen die Bedingungen) und gegebenenfalls dort seine Berechnungen/Aggregationen werden auf der Spalte vorgenommen? – Unreason