Clusterová tabulka je B-Strom bez části "haldy" - řádky jsou uloženy přímo ve struktuře B-Stromu indexu shlukování (primární klíč). Uzly B-stromu lze rozdělit nebo sloučit, takže fyzické umístění nebo řádky se mohou změnit, takže nemůžeme mít jednoduchý „ukazatel“ ze sekundárního indexu na řádky, takže sekundární index musí obsahovat úplnou kopii pole primárního indexu, aby bylo možné spolehlivě identifikovat řádky.
To platí pro Oracle, MS SQL Server a platí také pro InnoDB .
Což znamená, že sekundární indexy v klastrových tabulkách jsou „tučnější“ než sekundární indexy v tabulkách založených na haldě, což:
- snižuje shlukování dat,
- snižuje účinnost mezipaměti,
- prodražuje jejich údržbu,
- a co je nejdůležitější, má důsledky na výkon dotazu:
- Dotazování prostřednictvím sekundárního indexu může vyžadovat dvojité vyhledávání – jedno vyhledávání přes sekundární index k nalezení „klíčových“ dat a druhé přes primární, k nalezení samotného řádku (Oracle má několik zajímavých optimalizací, jak se vyhnout druhému vyhledávání, ale InnoDB ne, pokud je mi známo).
- Na druhou stranu sekundární index přirozeně pokrývá více polí, takže druhému vyhledávání by se mohlo úplně vyhnout tam, kde by tradiční index založený na haldě vyžadoval přístup k tabulce. Stejného efektu však lze dosáhnout v indexu založeném na haldě jednoduchým přidáním více polí.
Dovolte mi citovat Používejte index, Luku! :"Výhody indexově organizovaných tabulek a seskupených indexů jsou většinou omezeny na tabulky, které nepotřebují druhý index."
Což je škoda, protože MySQL vám neumožňuje zvolit shlukování nezávisle na úložišti.