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

Złożone indeksy MySQL i operator BETWEEN

Twój styl jest bardzo rzadki.

Większość ludzi prawdopodobnie napisałaby WHERE began_at < NOW() AND finished_at > NOW()

Jednakże. Zalecam umieszczenie indeksu w obu polach.

Połączony klucz nie będzie dla Ciebie przydatny, ponieważ przyspieszyłby tylko wyszukiwanie określonych kombinacji dat.

Cóż, nie jest to do końca prawdą, ponieważ jeśli użyjesz betree, klucz złożony pomoże ci, ale nie tak dobry, jakbyś indeksował je osobno. Klucze połączone są bardzo dobre, jeśli przeszukujesz kombinacje pól z operatorem równości (=). Indeksy pojedynczego pola działają lepiej w żądaniach ragen.

Możesz trochę wyszukać w Google „wielowymiarowe wyszukiwanie zakresu”.

Powodem jest to, że wszystkie pasujące pola w jednym polu można w zasadzie znaleźć w czasie log(n) w btrees. Więc ogólny czas działania będzie wynosił O(k*log(n)), czyli O(log(n)).

Zapytania zakresu wielowymiarowego mają czas wykonywania O(sqrt(n)), który jest dłuższy. Jednak są też lepsze implementacje, które również nie pozwalają na logarytmiczne działanie. Jednak nie są one w pełni zaimplementowane w mysql, więc będzie gorzej lub okropnie w zależności od wersji.

Więc podsumuję:

  • Porównanie równości na pojedynczych polach:indeks skrótu (runtime O(1))

  • Przeszukiwanie zakresu na pojedynczych polach:indeks btree na pojedynczych polach ( O(log(n)) )

  • Wyszukiwanie równości w wielu polach:połączony klucz skrótu (środowisko uruchomieniowe O(1))

te przypadki są jasne...

  • Przeszukiwanie zakresu w wielu polach:oddzielne indeksy btree ( O(log(n)) )

tutaj nie jest to takie jasne. z obecnymi wersjami wyraźnie lepiej jest indeksować osobno z powodów podanych powyżej. Dzięki doskonałej implementacji dla tego przypadku użycia można osiągnąć lepszą wydajność z połączonymi kluczami, ale nie ma wiedzy, który to obsługuje. mysql obsługuje luźne indeksy (co potrzebujesz do tego) od wersji 5.0, ale tylko bardzo ograniczone, a optymalizator zapytań wykorzystuje je tylko w rzadkich przypadkach afaik. nie wiem o nowszych wersjach, takich jak 5.3 lub coś takiego.

jednak z mysql implementującym luźne indeksy, kombinacje kluczy w polach, w których wykonujesz żądania zakresu lub sortujesz w różnych kierunkach, stają się coraz bardziej istotne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CakePHP zagnieżdżanie dwóch zapytań wybierających

  2. Jak działa funkcja OCT() w MySQL

  3. Jaka jest różnica między ifnull a coalesce w mysql?

  4. właściwa składnia do użycia w pobliżu „?”

  5. Błąd MySQL - SQLSTATE [42000]:Błąd składni lub naruszenie dostępu:1064