Vyšší mohutnost znamená lepší výkon při čtení, protože podle definice je ke čtení méně záznamů.
Postup zpracování dotazu takto:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
, motor by měl provést následující kroky:
-
Najděte první záznam splňující podmínku.
To se provádí procházením
B-Tree
, počínaje kořenovým záznamem.Na stránkách se vyhledávání provádí podle
B-Tree
Odkazy; na stránce se vyhledávání provádí pomocí binárního vyhledávání (pokud nejsou vaše klíče komprimované, v takovém případě se jedná o lineární vyhledávání).Tento algoritmus má stejnou účinnost pro sloupce s vysokou i nízkou mohutností. Hledání prvního
3
(na rozdíl od všech3
) v těchto seznamech:1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 4 4
vyžaduje stejné
O(log(n))
kroky. -
Procházení indexu, dokud se nezmění hodnota klíče. To samozřejmě vyžaduje lineární čas:čím více záznamů máte, tím více jich musíte procházet.
Pokud potřebujete pouze první záznam:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
LIMIT 1
, mohutnost sloupce neovlivňuje výkon čtení.
Každý indexový klíč má skrytou další hodnotu:ukazatel záznamu. To je celý smysl indexu:musíte vědět, na který záznam ukazuje.
Vzhledem k tomu, že ukazatel záznamu je podle definice jedinečný, je jedinečný i každý indexový klíč. Položky indexu sdílející stejnou hodnotu klíče jsou seřazeny podle ukazatele záznamu.
Je to proto, aby bylo možné index udržovat:pokud odstraníte záznam s hodnotou indexovaného sloupce sdíleného milionem dalších záznamů, měl by být odstraněn i odpovídající záznam indexu. Ale celý milion záznamů indexu není prohledáván:místo toho se jako další podmínka vyhledávání používá ukazatel záznamu.
Každý indexový klíč je ve skutečnosti jedinečný (i když index nedefinujete jako jedinečný), a proto má maximální možnou mohutnost.
Takže odpověď na vaše otázky zní:ne, mohutnost sloupce neovlivňuje výkon zápisu indexu.