sql >> Databáze >  >> RDS >> Mysql

Kompozitní primární klíč ve výkonu v MySQL

INSERT a UPDATE výkon se liší jen málo:bude téměř stejný pro (INT) a (INT, INT) klíče.

SELECT výkon složeného PRIMARY KEY závisí na mnoha faktorech.

Pokud je vaše tabulka InnoDB , pak je tabulka implicitně seskupena na PRIMARY KEY hodnotu.

To znamená, že vyhledávání obou hodnot bude rychlejší, pokud obě hodnoty obsahují klíč:nebude vyžadováno žádné další vyhledávání klíče.

Za předpokladu, že váš dotaz je něco takového:

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

a rozložení tabulky je toto:

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

, motor bude muset vyhledat přesnou hodnotu klíče v samotné tabulce.

Pokud jako falešné ID použijete pole automatického zvýšení:

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

, pak bude stroj muset nejprve vyhledat hodnoty (col1, col2) v indexu ix_mytable_col1_col2 , načtěte ukazatel řádku z indexu (hodnota id ) a proveďte další vyhledávání podle id v tabulce samotné.

Pro MyISAM tabulkách, na tom však nezáleží, protože MyISAM tabulky jsou organizovány na hromadě a ukazatel řádku je pouze odsazený od souboru.

V obou případech bude vytvořen stejný index (pro PRIMARY KEY nebo pro UNIQUE KEY ) a budou použity stejným způsobem.



  1. Co může plán dotazů prozradit?

  2. SQL, jak aktualizovat data

  3. Existuje nějaký rozdíl mezi !=a <> v Oracle Sql?

  4. jqGrid – Jedinečné ID pro nový řádek