2010-02-12 16 views
13

Was wäre die Leistungseinbuße bei der Verwendung von Strings als Primärschlüssel anstelle von Bigints usw.? String-Vergleich ist viel teurer als Ganzzahl-Vergleich, aber auf der anderen Seite kann ich mir vorstellen, dass intern ein DBMS Hash-Schlüssel berechnen wird, um die Strafe zu reduzieren.Leistungsstrafe von Strings als Primärschlüssel?

Eine Anwendung, die ich arbeite, verwendet Zeichenfolgen als Primärschlüssel in mehreren Tabellen (MySQL). Es ist nicht trivial, dies zu ändern, und ich würde gerne wissen, was man leistungsmäßig verdienen kann, um die Arbeit zu rechtfertigen.

+0

Duplizieren? http://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database –

Antwort

4

auf der anderen Seite kann ich mir vorstellen, dass intern ein DBMS Hash Schlüssel berechnen wird die Strafe zu reduzieren.

Die DB benötigt einen B-Baum (oder eine ähnliche Struktur) mit dem Schlüssel in einer Art und Weise zu halten sie bestellt zu haben.

Wenn der Schlüssel in den B-Baum gehackt und gespeichert ist, wäre es in Ordnung, die Eindeutigkeit des Schlüssels schnell zu überprüfen - der Schlüssel kann noch effizient nachgeschlagen werden. Aber Sie könnten nicht effizient nach Bereich von Daten suchen (z. B. mit LIKE), weil der B-Baum nicht mehr nach dem String-Wert geordnet ist.

Also ich denke, die meisten DB wirklich speichern Sie die Zeichenfolge in dem B-Baum, der kann (1) mehr Platz nimmt als numerische Werte und (2) ist es den B-Baum wieder ausgeglichen wenn Schlüssel zu sein werden in beliebiger Reihenfolge eingefügt (keine Vorstellung von steigendem Wert wie bei numerischem pk).

Die Strafe in der Praxis kann von unbedeutend bis riesig reichen. Alles hängt von der Verwendung, der Anzahl der Zeilen, der durchschnittlichen Größe des Zeichenfolgenschlüssels, den Abfragen, die der Tabelle beitreten usw. ab.

1

Es hängt von mehreren Faktoren ab: RDBMS, Anzahl der Indizes, die diese Spalten enthalten, aber im Allgemeinen wird es effizienter sein, indem man ints verwendet, gefolgt von bigints.

Alle Leistungssteigerungen hängen von der Verwendung ab, daher ist es ohne konkrete Beispiele für Tabellenschema und Abfragearbeitsaufwand schwer zu sagen.

Sofern es in der Domäne Sinn macht (ich denke single so etwas wie Sozialversicherungsnummer), ist ein Ersatz Integer-Schlüssel eine gute Wahl; Verweisende Objekte brauchen ihre FK-Referenz nicht aktualisiert zu haben, wenn sich das referenzierte Objekt ändert.

3

In unserem Produkt verwenden wir varchar (32) für Primärschlüssel (GUIDs) und wir haben Leistungsprobleme dieser nicht erfüllt. Unser Produkt ist eine Website mit extremer Überlastung und ist entscheidend für Stabilität. Wir verwenden SQL Server 2005.

Bearbeiten: In unseren größten Tabellen haben wir mehr als 3 000 000 Datensätze mit vielen Einsätzen und wählt aus ihnen. Ich denke, im Allgemeinen wird der Vorteil der Migration auf int Schlüssel sehr gering sein, aber die Probleme bei der Migration sehr hoch.

+1

Es gibt einen GUID-Typ in SQL Server. Außerdem ist es ideal für die Replikation. – Timmy

1

Eine Sache, auf die man achten sollte, ist Seitenaufteilungen (ich weiß, dass dies in SQL Server passieren kann - wahrscheinlich dasselbe in MySQL).

Primärschlüssel sind physisch geordnet. Durch die Verwendung einer Ganzzahl mit automatischer Inkrementierung können Sie sicherstellen, dass Sie bei jedem Einfügen die nächste Zahl einfügen, sodass die Datenbank nicht neu angeordnet werden muss. Wenn Sie jedoch Zeichenfolgen verwenden, müssen Sie möglicherweise den von Ihnen eingefügten PK in die Mitte der anderen Schlüssel setzen, um die PK-Reihenfolge beizubehalten. Dieser Prozess des Neuordnens der PKs auf dem Einsatz kann teuer werden.

Verwandte Themen