Ich bin gerade dabei, eine Tabelle zu erstellen, und ich habe mich gefragt.
Wenn ich Autos mit einer Marke speichere (z. B. BMW, Audi usw.), hat dies einen Einfluss auf die Abfragegeschwindigkeit, wenn ich die Marke als int oder varchar speichere.
So ist es auch
SELECT * FROM table WHERE make = 5 AND ...;
Schneller / langsamer als
SELECT * FROM table WHERE make = 'audi' AND ...;
oder wird die Geschwindigkeit mehr oder weniger gleich sein?
sql
performance
postgresql
select
googletorp
quelle
quelle
Einige grobe Benchmarks:
4 Millionen Datensätze in Postgres 9.x.
Ergebnisse auf 8 GB RAM, i7, SSD-Laptop:
So wie es für dieses Setup aussieht, macht Bigint im Vergleich zu 16-stelligem Text keinen Unterschied in der Geschwindigkeit, solange Ihre Indizes in den Arbeitsspeicher passen.
quelle
Mit einem int anstelle eines varchar wird es etwas schneller. Wichtiger für die Geschwindigkeit ist es, einen Index für das Feld zu haben, mit dem die Abfrage die Datensätze finden kann.
Es gibt einen weiteren Grund, ein int zu verwenden, nämlich die Datenbank zu normalisieren. Anstatt den Text 'Mercedes-Benz' tausende Male in der Tabelle zu speichern, sollten Sie seine ID speichern und den Markennamen einmal in einer separaten Tabelle speichern.
quelle
Mercedes-Benz
tausende Male ID zu speichern1
. Zum Beispiel Tabellecar_brands
, SpaltenBrands
undId
. ReiheMercedes-Benz
und1
. Und in der SpalteBrands
und im Wert der Haupttabelle1
. Und wannSELECT
, dann zuerstId
vom Tischcar_brands
und dannSELECT Something FROM main_table WHERE Brands = (SELECT Id FROM car_brands WHERE Brands = Mercedes-Benz)
. Oder ein anderer Ansatz?select something from main_table c inner join car_brands b on b.Id = c.Brands where b.Brands = 'Mercedes-Benz'
.In diesem Fall spielt es keine Rolle, ob die Größe des Zeichenfolgenvergleichs im Vergleich zu Nicht-Floats vorliegt oder nicht. Größe ist eigentlich der wahre Leistungsunterschied. Sei es 1 Byte + (bis zu 126 Byte) im Vergleich zu 1,2,4 oder 8 Byte Vergleich ... offensichtlich sind Nicht-Float kleiner als Strings und Floats und daher CPU-freundlicher in der Montage.
Der Vergleich von Zeichenfolgen zu Zeichenfolgen in allen Sprachen ist langsamer als etwas, das von der CPU in einem Befehl verglichen werden kann. Selbst der Vergleich von 8 Byte (64 Bit) auf einer 32-Bit-CPU ist immer noch schneller als ein VARCHAR (2) oder größer. * Schauen Sie sich noch einmal die produzierte Baugruppe an (auch von Hand). Es sind mehr Anweisungen erforderlich, um char by char zu vergleichen, als 1 bis 8 Byte CPU-Zahlen.
Wie viel schneller? hängt auch vom Datenvolumen ab. Wenn Sie einfach 5 mit 'audi' vergleichen - und das ist alles, was Ihre Datenbank hat, ist der resultierende Unterschied so gering, dass Sie ihn niemals sehen würden. Abhängig von der CPU, der Implementierung (Client / Server, Web / Skript usw.) wird es wahrscheinlich erst angezeigt, wenn Sie einige hundert Vergleiche auf dem DB-Server durchgeführt haben (möglicherweise sogar ein paar tausend Vergleiche, bevor es auffällt).
Ozz
quelle
Index oder nicht, int ist viel schneller (je länger der Varchar, desto langsamer wird er).
Ein weiterer Grund: Der Index für das Varchar-Feld ist viel größer als für Int. Bei größeren Tabellen kann dies Hunderte von Megabyte (und Tausende von Seiten) bedeuten. Dies macht die Leistung erheblich schlechter, da das Lesen des Index allein viele Festplattenlesevorgänge erfordert.
quelle
Im Allgemeinen wird der int schneller sein. Je länger der Varchar ist, desto langsamer wird er
quelle
Hinweis: Wenn die möglichen Werte für das Feld machen werden nie (oder selten) ändern, Sie ENUM als Kompromiss verwenden können. Es kombiniert gute Geschwindigkeit mit guter Lesbarkeit.
quelle
enum
Datentyp? Ich dachte, es war MySQL-spezifisch.Wenn Sie die Indizierung für eines der Felder aktivieren, ist dies schneller. Was deine Frage betrifft, denke ich
int
ist schneller alsvarchar
.quelle
Etwas relativ. Ja, INTs werden schneller sein, aber die Frage ist, ob es in Ihrer Situation auffällt. Sind die VARCHARs nur ein paar kleine Wörter oder längere Texte? und wie viele Zeilen enthält die Tabelle? Wenn es nur wenige Zeilen gibt, wird es höchstwahrscheinlich vollständig im Speicher gepuffert (wenn dies häufig angefordert wird). In diesem Fall werden Sie keinen großen Unterschied bemerken. Dann gibt es natürlich eine Indizierung, die wichtiger wird, wenn die Tabelle wächst. Die Verwendung von SSDs ist möglicherweise schneller als HDs mit optimierten Abfragen. Auch gute Festplattencontroller beschleunigen manchmal Abfragen> 10x. Dies lässt möglicherweise Platz für die Verwendung von VARCHARs, was das Lesen und Schreiben von Abfragen erleichtert (es müssen keine komplexen Verknüpfungen geschrieben werden) und die Entwicklung beschleunigt. Puristen werden jedoch nicht zustimmen und immer alles normalisieren.
quelle