2011-01-05 22 views
10

Welche der folgenden Abfragen werden schneller und optimalere (und warum):INT vs VARCHAR auf der Suche

  1. SELECT * FROM items WHERE w = 320 AND h = 200 (w und h INT)

  2. SELECT * FROM items WHERE dimensions = '320x200' (Dimensionen ist VARCHAR)

+2

Ich möchte darauf hinweisen, dass die beiden Spalten wahrscheinlich auch genauere Daten enthalten, die für ein gutes Datenbankdesign entscheidend sind. – HLGEM

+0

Es wäre ein besserer Vergleich gewesen, wenn Sie angegeben hätten, die Höhe und die Breite als zwei getrennte varchar zu vergleichen. Sie haben alle antworten, wenn dies und wenn das ... – puck

Antwort

5

Hier sind einige tatsächliche Messungen. (Mit SQLite; kann es später mit MySQL versuchen.)

Daten = Alle 1.000.000 Kombinationen von w, h ∈ {1 ... 1000}, in zufälliger Reihenfolge.

CREATE TABLE items (id INTEGER PRIMARY KEY, w INTEGER, h INTEGER)

Durchschnittliche Zeit (von 20 Läufen) SELECT * FROM items WHERE w = 320 and h = 200 auszuführen war 5,39 ± 0,29 us.

CREATE TABLE items (id INTEGER PRIMARY KEY, dimensions TEXT)

Durchschnittliche Zeit SELECT * FROM items WHERE dimensions = '320x200' auszuführen war 5,69 ± 0,23 us.

Es gibt keinen signifikanten Unterschied, Effizienz-weise.

Aber

Es gibt einen großen Unterschied in Bezug auf Benutzerfreundlichkeit. Zum Beispiel, wenn Sie die Fläche und den Umfang der Rechtecken, der zweispaltige Ansatz berechnen wollen, ist einfach:

SELECT w * h, 2 * (w + h) FROM items

Versuchen Sie, die entsprechende Abfrage für die andere Art und Weise zu schreiben.

+0

'Abmessungen TEXT' ???? – ajreal

0

erste, weil es schneller ist, numerische Daten zu vergleichen.

2

Wahrscheinlich ist die einzige Möglichkeit zu wissen, dass es ausgeführt wird. Ich würde vermuten, dass, wenn alle verwendeten Spalten indiziert sind, es im Grunde keinen Unterschied geben würde. Wenn INT 4 Byte ist, wird es fast die gleiche Größe wie die Zeichenfolge haben.

Die eine Falte ist, wie VARCHAR gespeichert wird. Wenn Sie eine konstante String-Größe verwendet haben, könnte es schneller als VARCHAR sein, aber vor allem, weil Ihr select * es bekommen muss.

Der große Vorteil der Verwendung von INT ist, dass Sie viel differenzierter filtern können. Das allein sollte ein Grund sein, es vorzuziehen. Was ist, wenn Sie einen Bereich oder nur eine Breite benötigen oder wenn Sie die Breite in der Filterung mathematisch berechnen möchten? Was ist mit Einschränkungen basierend auf den Spalten oder Aggregaten?

Wenn Sie die Werte in Ihre Programmiersprache eingeben, müssen Sie sie nicht analysieren, bevor Sie sie verwenden (das kostet Zeit).

EDIT: Einige andere Antworten erwähnen Zeichenfolge Vergleiche. Wenn indiziert, wird es nicht viele String-Vergleiche geben. Und es ist möglich, sehr schnelle Vergleichsalgorithmen zu implementieren, die nicht Byte für Byte durchlaufen müssen. Sie müssen wissen, was mysql genau weiß.

1

zweite Abfrage, da die Chancen, die genaue Zeichenfolge übereinstimmen kleiner (die kleinere Menge von Datensätzen bedeuten aber mit größerer Mächtigkeit)

erste Abfrage, die Chancen passende erste Spalte ist höher und mehr Zeilen möglicherweise angepasst (weniger Mächtigkeit)

natürlich Index unter der Annahme, für beiden Szenarios Intuitiv

+0

Würde dies nicht versetzt werden durch Durchsuchen eines kleineren Datensatzes, da die erste Abfrage zuerst nur Zeilen finden, wo das erste Feld übereinstimmt, dann durchsuchen Sie diesen Datensatz für Übereinstimmungen im zweiten Feld? – JNK

+0

@JNK - erklärte weniger Rekord, aber größere Kardinalität, vergleichen zwei Spalte nur mehr Rekord mit weniger Kardinalität auf jeder Spalte – ajreal

2

definiert ist, wenn Sie INDEX es auf diesen Spalten nicht erzeuge, scheint integer Vergleich schneller.

Im Ganzzahlvergleich vergleichen Sie direkt die 32-Bit-Werte mit logischen Operatoren.

Auf der anderen Seite, Zeichenfolgen sind Zeichen-Arrays, wird es schwierig sein, sie zu vergleichen. Zeichenweise.

Ein weiterer Punkt ist, dass in der zweiten Abfrage Sie 1 Feld zum Vergleichen haben, in der ersten Abfrage haben Sie 2 Felder. Wenn Sie 1.000.000 Datensätze und keine Indizes für Spalten haben, bedeutet dies, dass Sie im schlimmsten Fall 1.000.000 Zeichenfolgenvergleiche haben können (unglücklicherweise ist das letzte Ergebnis das, wonach Sie gesucht haben oder nicht)

Auf der anderen Seite haben Sie 1.000.000 Datensätze und alle sind w=320, dann werden Sie sie auch für h vergleichen. Das bedeutet 2.000.000 Vergleiche. Wie auch immer Sie INDEXes auf diesen Feldern erstellen, IMHO werden sie fast identisch sein, da VARCHAR gehashed wird (dauert O(1) konstante Zeit) und wird mit INT-Vergleich verglichen und O(logn) Zeit nehmen.

Fazit, es kommt darauf an. Bevorzugen Sie Indizes für durchsuchbare Spalten und verwenden Sie Ints.

0

Es hängt von den Daten und den verfügbaren Indizes ab. Es ist jedoch durchaus möglich, dass die VARCHAR-Version schneller ist, da die Suche nach einem einzelnen Index schneller als zwei sein kann. Wenn die Kombination von Werten ein eindeutiges (oder "meist" eindeutiges) Ergebnis liefert, während jeder einzelne H/W-Wert mehrere Einträge aufweist, könnte es die Abwärtsverarbeitung auf einen viel kleineren Satz unter Verwendung des einzelnen Index eingrenzen.

Auf der anderen Seite, wenn Sie einen mehrspaltigen Index für die Integer-Spalten haben, wäre dies wahrscheinlich die effizienteste.