Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Tabelle mit zusammengesetztem Index, aber ohne Primärschlüssel

Ein paar Punkte:

Es hört sich so an, als würden Sie nur das verwenden, was derzeit an der Tabelle einzigartig ist, und dies als Primärschlüssel verwenden. Das funktioniert. Und natürliche Schlüssel haben einige Vorteile, wenn es um die Abfrage wegen der Lokalität geht. (Die Daten für jeden Benutzer werden im selben Bereich gespeichert). Und weil die Tabelle durch diesen Schlüssel geclustert wird, wird das Suchen nach den Daten eliminiert, wenn Sie nach den Spalten in der Primärdatenbank suchen.

  1. Die Verwendung eines natürlichen Primärschlüssels, wie Sie ihn gewählt haben, hat jedoch auch Nachteile für die Leistung.

  2. Die Verwendung eines sehr großen Primärschlüssels macht alle anderen Indizes in innodb sehr groß, da der Primärschlüssel in jedem Indexwert enthalten ist.

  3. Die Verwendung eines natürlichen Primärschlüssels ist nicht so schnell wie ein Ersatzschlüssel für INSERTs, da er nicht nur größer ist, sondern auch nicht jedes Mal einfach am Ende der Tabelle eingefügt werden kann. Es muss in den Abschnitt für diesen Benutzer und Post usw. eingefügt werden.

  4. Wenn Sie nach Zeit suchen, werden Sie höchstwahrscheinlich mit einem natürlichen Schlüssel in der gesamten Tabelle suchen, es sei denn, die Zeit ist Ihre erste Spalte. Ersatzschlüssel sind in der Regel zeitlich lokal und können für einige Abfragen oft genau richtig sein.

  5. Die Verwendung eines natürlichen Schlüssels wie Ihres als Primärschlüssel kann ebenfalls lästig sein. Was ist, wenn Sie sich auf eine bestimmte Abstimmung beziehen möchten? Sie benötigen einige Felder. Außerdem ist die Verwendung mit vielen ORMs etwas schwierig.

Hier ist die Antwort

Ich würde Ihren eigenen Ersatzschlüssel erstellen und ihn als Primärschlüssel verwenden, anstatt mich auf den internen Primärschlüssel von innodb zu verlassen, da Sie ihn für Aktualisierungen und Suchen verwenden können.

ALTER TABLE tbl_rate 
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
ADD PRIMARY KEY(id);

Aber wenn Sie einen Ersatz-Primärschlüssel erstellen, würde ich Ihren Schlüssel auch zu einem EINZIGARTIGEN Schlüssel machen. Gleiche Kosten, aber es erzwingt Korrektheit.

ALTER TABLE tbl_rate 
ADD UNIQUE ( user_id, post_id, type );