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

Leistungsnachteil des zusammengesetzten Primärschlüssels in MySQL

INSERT und UPDATE Die Leistung variiert nur wenig:Sie wird für (INT) fast gleich sein und (INT, INT) Tasten.

SELECT Leistung des zusammengesetzten PRIMARY KEY hängt von vielen Faktoren ab.

Wenn Ihre Tabelle InnoDB ist , dann wird die Tabelle implizit auf dem PRIMARY KEY geclustert Wert.

Das bedeutet, dass die Suche nach beiden Werten schneller ist, wenn beide Werte den Schlüssel enthalten:Es ist keine zusätzliche Schlüsselsuche erforderlich.

Angenommen, Ihre Abfrage lautet in etwa so:

SELECT  *
FROM    mytable
WHERE   col1 = @value1
        AND col2 = @value2

und das Tabellenlayout ist dieses:

CREATE TABLE mytable (
        col1 INT NOT NULL,
        col2 INT NOT NULL,
        data VARCHAR(200) NOT NULL,
        PRIMARY KEY pk_mytable (col1, col2)
) ENGINE=InnoDB

, muss die Engine nur den genauen Schlüsselwert in der Tabelle selbst nachschlagen.

Wenn Sie ein Autoincrement-Feld als gefälschte ID verwenden:

CREATE TABLE mytable (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        col1 INT NOT NULL,
        col2 INT NOT NULL,
        data VARCHAR(200) NOT NULL,
        UNIQUE KEY ix_mytable_col1_col2 (col1, col2)
) ENGINE=InnoDB

, dann muss die Engine zuerst die Werte von (col1, col2) nachschlagen im Index ix_mytable_col1_col2 , rufen Sie den Zeilenzeiger aus dem Index ab (der Wert von id ) und führen Sie eine weitere Suche nach id durch in der Tabelle selbst.

Für MyISAM Tabellen macht das aber keinen Unterschied, weil MyISAM Tabellen sind Heap-organisiert und der Zeilenzeiger ist nur ein Datei-Offset.

In beiden Fällen wird derselbe Index erstellt (für PRIMARY KEY oder für UNIQUE KEY ) und wird auf die gleiche Weise verwendet.