Krycí index není totéž jako složený index.
Pokud mám 2 samostatné indexy, jeden na col3 a druhý na col4, který z nich bude použit v tomto dotazu?
Index s nejvyšší mohutností.
MySQL vede statistiky o tom, který index má jaké vlastnosti.
Bude použit index, který má největší rozlišovací schopnost (jak je patrné ze statistik MySQL).
Někde jsem četl, že pro každou tabulku v dotazu je použit pouze jeden index. Znamená to, že neexistuje způsob, jak by dotaz mohl použít oba indexy?
Můžete použít podvýběr.
Nebo ještě lépe použijte složený index, který obsahuje jak col3, tak col4.
Za druhé, pokud jsem vytvořil složený index pomocí col3 a col4 dohromady, ale použil jsem pouze col3 v klauzuli WHERE, bude to horší pro výkon? příklad:
Složený index
Správný výraz je compound
index, nikoli složený.
Pouze nejvíce vlevo bude použita část složeného indexu.
Pokud je tedy index definován jako
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
Viz:http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html
Všimněte si, že pokud vyberete pole zcela vlevo, nemusíte tuto část indexu v klauzuli where používat.
Představte si, že máme složený index
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
Důvodem, proč to funguje, je to, že první dotaz používá krycí index a prohledává ho.
Druhý dotaz potřebuje přístup k tabulce, a proto skenování přes index nedává smysl.
Toto funguje pouze v InnoDB.
Co je krycí index
Index pokrytí označuje případ, kdy jsou všechna pole vybraná v dotazu covered
indexem, v takovém případě InnoDB (nikoli MyISAM) nikdy nepřečte data v tabulce, ale použije pouze data v indexu, což výrazně urychlí výběr.
Všimněte si, že v InnoDB je primární klíč zahrnut v všechny sekundární indexy, takže svým způsobem jsou všechny sekundární indexy složené indexy.
To znamená, že pokud na InnoDB spustíte následující dotaz:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL bude vždy používat krycí index a nebude mít přístup ke skutečné tabulce. I když by mohl používat krycí index, bude preferovat PRIMARY KEY
protože potřebuje zasáhnout pouze jeden řádek.