To je způsobeno tím, čemu říkám 5% pravidlo založené na klíčové populaci (dvojitá mohutnost).
Pokud indexujete tabulku, kde existuje nevychýlená mohutnost, MySQL Query Optimizer vždy zvolí cestu nejmenšího odporu.
PŘÍKLAD :Pokud tabulka obsahuje sloupec pohlaví, mohutnost je dvě, M a F.
Co indexujete takový sloupec pohlaví??? V podstatě získáte dva obří propojené seznamy.
Pokud načtete jeden milion řádků do tabulky se sloupcem pohlaví, můžete získat 50 % M a 50 % F.
Index je během optimalizace dotazu nepoužitelný, pokud je mohutnost kombinace klíčů (populace klíčů, jak jsem to formuloval) větší než 5 % z celkového počtu tabulek.
Nyní, s ohledem na váš příklad, proč dva různé plány EXPLAIN ??? Můj odhad je MySQL Query Optimizer a InnoDB jako tým tagů.
V prvním CREATE TABLE mají tabulka a indexy přibližně stejnou velikost, i když jsou malé, takže rozhodl se ve prospěch indexu provedením indexového skenování, nikoli úplného skenování tabulky . Mějte na paměti, že nejedinečné indexy obsahují interní primární klíč každého řádku (RowID) v položkách indexu, takže indexy mají téměř stejnou velikost jako samotná tabulka.
Ve druhé CREATE TABLE, díky zavedení dalšího sloupce, uživatel, nyní optimalizátor dotazů vidí úplně jiný scénář:Tabulka je nyní větší než indexy . Proto se Optimalizátor dotazů stal přísnější ve své interpretaci toho, jak používat dostupné indexy. Došlo k pravidlu 5 %, které jsem zmínil dříve. Toto pravidlo žalostně selhalo a optimalizátor dotazů se rozhodl pro úplné prohledání tabulky.