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

Krytí Mysql vs kompozitní vs index sloupců

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.



  1. Vyplnění položky stromu skupinou záznamů v Oracle Forms

  2. Dejte si pozor na zavádějící data z SET STATISTICS IO

  3. Jak opravit chybu „funkce datediff vedla k přetečení“ na serveru SQL Server

  4. Úvod do SQL indexů