Dlaczego MySQL nie używa indeksu?
MySQL nie użyje indeksu, jeśli duży procent wierszy ma tę wartość.
Dlaczego dodanie use index
do zapytania nie działa tutaj
Dodawanie use index
klauzula nie zadziała, ponieważ use index
zasugeruje tylko, które indeks do użycia, nie zasugeruje, czy użyć indeksu, czy nie.
Uważaj przy korzystaniu z tabel testowych z kilkoma wierszami
Jest to szczególnie dokuczliwe, gdy używasz tabel testowych z kilkoma wierszami, ponieważ MySQL odmówi użycia indeksu i trudno będzie zobaczyć, co jest nie tak z zapytaniem.
Więc upewnij się, że do tabeli testowej dodasz wystarczającą liczbę wierszy aby był to realistyczny test.
Czy używanie indeksu w kolumnach o niskiej kardynalności jest bezużyteczne?
Indeksowanie w kolumnach logicznych nie jest tak przydatne jak myślałeś przed zadawaniem tego pytania.
Jednak nie jest to również bezużyteczne albo.
Z InnoDB MySQL spróbuje pobrać dane za pomocą indeksów, jeśli to możliwe, jeśli twoje pole logiczne ma indeks, zapytanie:
SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1
Może odczytać wszystkie dane w indeksie pokrywającym dla bool_field
ponieważ indeksy dodatkowe w InnoDB zawsze zawierają indeks główny (id) również.
Jest to szybsze, ponieważ MySQL nie musi wczytywać całej tabeli do pamięci.
W MyISAM to nie działa i MySQL przeanalizuje całą tabelę.
Ale mogę użyć force index
Możesz, ale przy indeksach o niskiej kardynalności spowoduje to, że Twoje zapytanie będzie wolniejsze, a nie szybsze.Zastępuj indeksy tylko w przypadku złożonych zapytań i tylko jeśli znasz zasady, których MySQL używa do wybierania indeksów.
Linki:
Patrz:http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
i: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
Jeśli chcesz książkę na ten temat:przeczytaj
Wysokowydajny MySQL:http://oreilly.com /katalog/9780596003067