Czy realistyczne jest posiadanie tylu wierszy o tej samej price
? ? Czy realistyczne jest zwrócenie 444 tys. wierszy z zapytania? Pytam o to, ponieważ optymalizacja zapytań opiera się na „normalnych” danych.
Indeks (np. INDEX(price)
) jest przydatne, gdy szukasz price
zdarza się to kilka razy. W rzeczywistości Optymalizator omija indeks, jeśli widzi, że szukana wartość występuje w ponad 20% przypadków. Zamiast tego po prostu zignoruje indeks i wykona to, co najpierw przetestowałeś — po prostu przeskanuje całą tabelę, ignorując wszelkie niepasujące wiersze.
Powinieneś to zobaczyć, robiąc
EXPLAIN select * from books where price = 10
z indeksem i bez niego. Możesz też spróbować:
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... Wygląda na to, że Optymalizator nie zignorował indeksu. Widzę, że „liczność” price
to „1”, co oznacza, że w tej kolumnie jest tylko jedna odrębna wartość. Ta „statystyka” jest albo nieprawidłowa, albo myląca. Uruchom to i zobacz, jakie zmiany:
ANALYZE TABLE books;
Spowoduje to ponowne obliczenie statystyk za pomocą kilku losowych sond i może zmień „1” na „2”.
Porady ogólne:uważaj na testy porównawcze, które działają na sfabrykowanych danych.