Je reálné mít tolik řádků se stejnou price
? ? Je reálné vrátit 444 kB řádků z dotazu? Ptám se na ně, protože optimalizace dotazů je založena na „normálních“ datech.
Index (např. INDEX(price)
) je užitečné při hledání price
který se vyskytuje v malém počtu případů. Ve skutečnosti se Optimalizátor vyhýbá indexu, pokud zjistí, že se hledaná hodnota vyskytuje ve více než 20 % případů. Místo toho by jednoduše ignoroval index a provedl by to, co jste testovali jako první – jednoduše prohledá celou tabulku a ignoruje všechny řádky, které se neshodují.
Měli byste to vidět, když to uděláte
EXPLAIN select * from books where price = 10
s indexem a bez něj. Případně můžete zkusit:
EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10
Ale, ... Zdá se, že Optimalizátor index neignoroval. Vidím, že "kardinalita" price
je "1", což znamená, že v tomto sloupci je pouze jedna odlišná hodnota. Tato „statistika“ je buď nesprávná, nebo zavádějící. Spusťte to prosím a podívejte se, jaké změny:
ANALYZE TABLE books;
Toto přepočítá statistiky pomocí několika náhodných testů a může změňte toto „1“ na možná „2“.
Obecná rada:Dejte si pozor na benchmarky, které běží proti smyšleným datům.