Mam tabelę 200k wpisów z kolumnami INT. Chcę utworzyć indeks, aby przyspieszyć zapytania. Oto kwerenda, którą chciałbym wykonać: SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)
. Stworzyłem następujące indeksy: B
, ACD
, C
, ABC
.MySQL. Tworzenie indeksu dla zapytań "OR"
Z poleceniem EXPLAIN
znalazłem, że MySQL wybiera indeks ACD
. Tak więc zapełniłem tabelę większymi wartościami i zdałem sobie sprawę, że MySQL przełączał się pomiędzy powyższymi indeksami (nie zawsze ten sam).
Ponieważ istnieje wiele wstawek, posiadanie różnych indeksów spowoduje problemy z wydajnością i możemy założyć, że do tej tabeli mają dostęp inne zapytania, które wymagają różnych kolumn, w których każdy indeks ma sens.
Jestem świadomy USE INDEX()
, ale chciałbym zrozumieć, czy powinniśmy zaufać MySQL, aby wybrać odpowiedni indeks.
Co rozumiesz przez "możemy założyć, że do tej tabeli mają dostęp inne zapytania, które wymagają różnych kolumn, gdzie każdy INDEX ma sens"? Czy możesz podać przykłady takich zapytań? Czy możesz również podać wynik zapytania 'SHOW INDEXES FROM table'? Indeksy A, AB i AC są z pewnością nadmiarowe: są one już uwzględnione w indeksach odpowiednio dla ACD/ABC, ABC i ACD. Możesz przeczytać o tym, jak MySQL obsługuje indeksy wielu kolumn pod adresem http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – Daan
Przykładowe zapytanie: 'GET B FROM table WHERE B = 12'. Ok, mogę wyeliminować A, AB, AC (dzięki). Ale nadal nie wyjaśnia powodu używania "ACD". Gdy 'D' nie jest nawet w instrukcji" WHERE ". –
Tak, to jest trochę tajemnicze: dane wyjściowe zapytania "POKAŻ INDEKSY OD ZESTAWU" mogą pomóc zrozumieć, dlaczego tak się dzieje :) – Daan