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

Mysql nepoužívá index DATETIME, když tabulka obsahuje jiná pole

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.




  1. Data zkrácena pro sloupec „xxxx“ na řádku 1

  2. Program MySQL mysql_tzinfo_to_sql

  3. Knihovna není načtena:/usr/local/opt/readline/lib/libreadline.6.2.dylib

  4. vyžaduje každé volání mysql_real_escape_string další cestu do databáze?