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

Dotaz MySQL je po vytvoření indexu pomalejší

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.



  1. Použijte spojení nebo spojení – co je rychlejší

  2. Jak používat řazení UTF-8 v databázi SQL Server?

  3. vytvořit ID v mysql tabulce auto_increment (po skutečnosti)

  4. Je možné mít indexovaný pohled v MySQL?