2013-08-09 8 views
6

Ich habe einen Primärschlüssel auf (A, B) wo A ist ein INT und B ist ein INT. Würden Abfragen, die auf A suchen, schneller laufen, wenn ich stattdessen einen Index auf A hätte?Ist ein mehrspaltiger Index langsamer als ein einspaltiger Index?

Ich verstehe die Präfixregel ganz links, aber ich bin gespannt, ob ein mehrspaltiger Schlüssel/Index schlechter als ein einspaltiger Schlüssel/Index ist, weil der Schlüssel länger ist.

+0

Wenn Sie eine Suchanfrage nur auf A durchgeführt haben, würde ein Index für A und B nicht verwendet, afaik. – sevenseacat

+1

@sevenseacat Sie besser über die am weitesten links Regel lesen :) –

+0

klingt wie ich wahrscheinlich sollte. – sevenseacat

Antwort

1

In einigen Fällen kann es noch schlimmer führen - wenn der Rest der Spalten groß sind, zum Beispiel: A: int, B: varchar (128), C: Text Index A wird als Index für eine bessere Leistung , B, C

In den meisten Fällen führt es das gleiche aus; In Ihrem Fall haben Sie 4 vs 8 Bytes, so dass es nicht wert ist, einen zweiten Index zu haben. Beachten Sie, dass der Primärschlüssel besser als ein Sekundärindex ist, insbesondere wenn die Speicher-Engine InnoDB ist (der Primärschlüssel ist ein Clustering-Index) und keine abdeckende Abfrage (er muss nicht auf die Tabelle zugreifen, um Daten zu laden) im Index gespeichert)

Tatsächlich enthalten alle Sekundärindizes in InnoDB den Primärschlüssel, daher sind sie standardmäßig größer als der PK.

+0

Ich verstehe. Ich überprüfte die Tabelle und erkannte, dass beide Spalten INTs sind, also überarbeitete ich meinen Beitrag. Es ist sehr nützlich zu wissen, dass ein Primärschlüssel besser ist als ein Index, danke! – ktm5124

1

Sie haben eine Situation, in der der zusammengesetzte Schlüssel aus zwei Komponenten besteht. Der erste ist 4 Bytes und der zweite 4 Bytes. Der Gesamtschlüssel beträgt 8 Bytes.

Ein Primärschlüssel-Index ist gruppiert, was bedeutet, dass die "Blätter" des B-Baums die eigentlichen Datensätze selbst sind. Auf einen gruppierten Index kann schneller zugegriffen werden als auf andere Arten von Indizes.

Ein Kriterium bei der Leistung eines Index ist die Größe des Schlüssels (sowie zusätzliche Spalten im Index). Ein Index mit einem 4-Byte-Schlüssel wird kleiner sein als ein Index mit einem 8-Byte-Schlüssel. Dies bedeutet weniger Festplattennutzung und weniger Speicherplatz im Speicher. Die Gewinne hier könnten jedoch ziemlich gering sein. Schließlich würden eine Million Zeilen in der Tabelle höchstens 10-20 Millionen Bytes entsprechen (Indizes haben zusätzliche Gemeinkosten in ihnen).

Eine weitere Überlegung ist die Durchführung von Datenmodifikationsschritten. In einem gruppierten Index erfordert das Einfügen/Ändern eines Schlüsselwerts in der Mitte einer Tabelle das erneute Schreiben der Datensätze selbst. Allerdings scheint die Adressänderung keine Frage zu sein.

Wenn Sie den Primärschlüsselindex bereits definiert haben, ist das Hinzufügen eines weiteren Indexes zusätzlicher Systemaufwand. Sie könnten feststellen, dass beide Indizes Speicher belegen, so dass Sie statt Speicherplatz sparen tatsächlich hinzufügen.

Letztlich ist die Antwort auf diese Art von ziemlich arkanen Frage, einige Timing-Tests zu tun. Wenn die B Spalte viel, viel größer als die A Komponente wäre, könnte ich möglicherweise einige Gewinne sehen. Für Abfragen, die nurA verwenden, könnte ich möglicherweise einige Gewinne sehen. Ich vermute jedoch, dass solche Gewinne ziemlich gering wären.

+0

Wenn Sie sagen, die erste Komponente des Schlüssels ist 4 Bytes, wäre dies wahr, wenn 'A' ein' VARCHAR (32) 'wäre? 'VARCHAR (100)'? – ktm5124

+0

@ ktm5124. . . Und ich habe die Antwort überarbeitet, nachdem Sie diese Änderung vorgenommen haben. Die Größe eines 'varchar (32)' hängt von den Daten ab. Also könnte es so klein wie ein Byte oder so groß wie 2 + die Größe der maximalen Länge sein. –

+0

Ich sehe, danke. Sie erwähnen Benchmarking als eine Möglichkeit, dies herauszufinden. Aber wenn es um MySQL geht, ist das Benchmarking aufgrund der verschiedenen Zwischenspeicherung auf allen Ebenen (Platten-I/O, Datenbank-Caching) sehr schwierig. Kennen Sie keine problemlosen Möglichkeiten, dieselbe Abfrage zweimal zu benchmarken? – ktm5124

Verwandte Themen