Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Prawidłowe indeksowanie przy użyciu operatora OR

Źle rozumiesz, jak działają indeksy.

Pomyśl o książce telefonicznej (odpowiednik dwukolumnowego indeksu na imię i nazwisko). Jeśli poproszę o odnalezienie w książce telefonicznej wszystkich osób, których nazwisko brzmi „Kowalski”, możesz skorzystać z tego, że nazwiska są tak ułożone; możesz założyć, że Kowale są zorganizowani razem. Ale jeśli poproszę Cię o znalezienie wszystkich osób, których imię brzmi „Jan”, nie uzyskasz żadnej korzyści z indeksu. Johny mogą mieć dowolne nazwisko, więc są porozrzucane po całej książce, a Ty musisz szukać trudnej drogi, od deski do deski.

Teraz, jeśli poproszę Cię o znalezienie wszystkich ludzi, których nazwisko brzmi „Smith” LUB których imię to „John”, możesz łatwo znaleźć Smithów, jak poprzednio, ale to wcale nie pomoże ci znaleźć Johnsów. Wciąż są one porozrzucane po całej książce i trzeba ich szukać w trudny sposób.

Tak samo jest z indeksami wielokolumnowymi w SQL. Indeks jest sortowany według pierwszej kolumny, następnie według drugiej kolumny w przypadku remisów w pierwszej kolumnie, a następnie według trzeciej kolumny w przypadku remisów w obu pierwszych kolumnach itd. Nie jest sortowany według wszystkich kolumn jednocześnie. Tak więc indeks wielokolumnowy nie pomaga w zwiększeniu wydajności wyszukiwanych haseł, z wyjątkiem skrajnej lewej kolumny w indeksie.

Wróć do pierwotnego pytania.

Utwórz osobny, jednokolumnowy indeks w każdej kolumnie. Jeden z tych indeksów będzie lepszym wyborem niż inne, w oparciu o oszacowanie liczby operacji we/wy indeks zostanie naliczony, jeśli zostanie użyty.

Współczesne wersje MySQL mają również pewne sprytne rozwiązania scalanie indeksów , więc zapytanie może użyj więcej niż jednego indeksu w danej tabeli, a następnie spróbuj scalić wyniki. W przeciwnym razie MySQL ogranicza się do używania jednego indeksu na tabelę w danym zapytaniu.

Inną sztuczką, której wiele osób z powodzeniem używa, jest wykonanie oddzielnego zapytania dla każdej z indeksowanych kolumn (które powinny używać odpowiedniego indeksu), a następnie UNION wyniki.

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Ostatnia obserwacja:jeśli znajdziesz to samo 'something' w czterech polach, powinieneś ponownie rozważyć, czy wszystkie cztery pola są faktycznie tym samym i jesteś winny zaprojektowania tabeli, która narusza pierwszą formę normalną z powtarzającymi się grupami . Jeśli tak, być może pola od 1 do 4 należą do jednej kolumny w tabeli podrzędnej. Wtedy znacznie łatwiej jest indeksować i wykonywać zapytania:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ostrzeżenie:mysql_query():podany argument nie jest prawidłowym zasobem MySQL-Link

  2. Przewodnik po projektowaniu bazy danych do zarządzania blogami w MySQL

  3. Zarządzanie kontami użytkowników, role, uprawnienia, uwierzytelnianie PHP i MySQL - Część 6

  4. Jak używać etykiety goto w funkcji przechowywanej MySQL

  5. Wyrażenie regularne MySQL jest znacznie wolniejsze niż podobne