Indeks, który opisujesz, jest praktycznie bezcelowy. Indeks najlepiej sprawdza się, gdy trzeba wybrać mały liczba wierszy w porównaniu do łącznej liczby wierszy.
Powodem tego jest sposób, w jaki baza danych uzyskuje dostęp do tabeli. Tabele można oceniać za pomocą pełnego skanu tabeli, w którym każdy blok jest kolejno odczytywany i przetwarzany. Lub przez wiersz lub wyszukiwanie klucza, gdzie baza danych ma klucz/wierd i odczytuje dokładnie ten wiersz, którego wymaga.
W przypadku użycia klauzuli WHERE opartej na kluczu podstawowym lub innym unikalnym indeksie, np. where id = 1
, baza danych może użyć indeksu, aby uzyskać dokładne odniesienie do miejsca przechowywania danych wiersza. Jest to wyraźnie bardziej wydajne niż pełne skanowanie tabeli i przetwarzanie każdego bloku.
Wracając do twojego przykładu, masz klauzulę where o where status = 'enabled'
, indeks zwróci 150 mln wierszy, a baza danych będzie musiała odczytać każdy wiersz po kolei za pomocą oddzielnych małych odczytów. Podczas gdy dostęp do tabeli z pełnym skanowaniem tabeli umożliwia bazie danych korzystanie z bardziej wydajnych, większych odczytów.
W pewnym momencie lepiej jest po prostu wykonać pełne skanowanie tabeli niż używać indeksu. Z mysql możesz użyć FORCE INDEX (idx_name)
jako część zapytania, aby umożliwić porównania między każdą metodą dostępu do tabeli.
Odniesienie:http://dev .mysql.com/doc/refman/5.5/en/jak-unikać-skanowania-tabeli.html