2012-06-12 14 views
7

Rozważmy następujący dwa wyjaśnia:Brak indeksu na! =?

EXPLAIN SELECT * FROM sales WHERE title != 'The' 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ALL  title  NULL NULL NULL 41707 Using where 

I -

EXPLAIN SELECT * FROM sales WHERE title = 'The' 
id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ref  title   title 767 const 1 Using where 

Dlaczego zapytania != mieć klucz NULL? Dlaczego nie korzysta z title? Co powoduje, że instrukcja = może korzystać z indeksu, ale nie z !=?

Odpowiedz

11

Nie ma sensu korzystanie z indeksu, chyba że bardzo często jest to title'The'.

Ponieważ prawie każdy wiersz musi zostać wybrany, nie uzyskuje się nic z korzystania z indeksu. W rzeczywistości może być kosztowne korzystanie z indeksu, który prawdopodobnie determinuje twój silnik MySQL, więc decyduje się nie używać indeksu.

Porównaj ilość pracy wykonanej w tych dwóch sytuacjach:

Korzystanie z indeksu:

1) Czytaj całe drzewo indeksu do pamięci.
2) Wyszukaj w drzewie indeksów wartość "The" i odfiltruj te wpisy.
3) Odczytaj każdy wiersz z wyjątkiem kilku wyjątków (które prawdopodobnie znajdują się w tych samych blokach na dysku, co wiersze, które należy odczytać, aby cała tablica mogła zostać wczytana) z tabeli do pamięci.

Bez indeksu:

1) przeczytać każdy wiersz do pamięci i czytając je odfiltrować gdziekolwiek title = 'The' od wyniku ustawić

+1

Aby rozwinąć na tym - Wybór Każdy wiersz, w którym tytuł nie jest "The", zwróci prawie każdy wiersz w tabeli, więc nie ma sensu używanie w ogóle indeksu dla tego zapytania. (Ponieważ będziesz musiał przeskanować całą tabelę, aby zwrócić wszystkie te wiersze.) – duskwuff

Powiązane problemy