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

Czy indeks złożony ma kierunek w MySQL?

Jeśli chcesz uzyskać maksymalną prędkość wyszukiwania i mieć obie kolumny w połączeniu lub warunkach, ALE czasami kolumna a ma wyższą selektywność, a czasami kolumna b ma wyższą selektywność i chcesz wykorzystać ten fakt na podstawie pojedynczego indeksu.

Uważam również, że twój stosunek wielkości danych do wydajności maszyny powinien być dość wysoki, a jednocześnie będziesz musiał (zgadując) uznać każdą poprawę za konieczność (nawet jeśli tylko o kilka procent).

Jednak doświadczenie uczy, że wszystko zależy od wielu czynników; z określonymi środowiskami RDBMS i aplikacji lepiej przeprowadzać własne testy porównawcze.

EDYCJA:Dalsze wyjaśnienia dotyczące złożonych indexes.from wikipedia :
"Kolejność, w jakiej kolumny są wymienione w definicji indeksu, jest ważna. Możliwe jest pobranie zestawu identyfikatorów wierszy przy użyciu tylko pierwszej indeksowanej kolumny. Jednak nie jest to możliwe ani wydajne (na większości baz danych), aby pobrać zestaw identyfikatorów wierszy przy użyciu tylko drugiej lub większej indeksowanej kolumny.
Na przykład wyobraź sobie książkę telefoniczną uporządkowaną najpierw według miasta, potem według nazwiska, a następnie według imienia. podane jest miasto, można łatwo wyodrębnić listę wszystkich numerów telefonów dla tego miasta.Jednak w tej książce telefonicznej bardzo żmudne byłoby znalezienie wszystkich numerów telefonów dla danego nazwiska.Musiałbyś zajrzeć do każdego miasta sekcja dla wpisów o tym nazwisku."

Wyjaśnienia Wikipedii są być może zbyt uproszczone, ale dają podstawową ideę (jak to się dzieje, pamiętaj, że książki telefoniczne zwykle mają indeksy klastrowe i nie byłby to ogólny indeks bazy danych).

W zależności od rozmiaru indeksu w porównaniu z rozmiarem struktury danych w porównaniu z dostępną pamięcią w porównaniu z selektywnością w pierwszej kolumnie indeksu, użycie błędnie uporządkowanego indeksu może być znacznie mniej kosztowne niż użycie skanowania tabeli.

Ach, właśnie pomyślałem o lepszej analogii do przykładu, którego szukasz.Wyobraź sobie ładny podręcznik, który zawierałby spis treści z rozdziałami i podrozdziałami oraz numerami stron, na których się znajdują (co jest indeksem bez klastrów, który zawiera wskaźniki do rekordy danych - strony). Teraz wyobraź sobie, że podręcznik jest w standardzie SQL-92, wtedy większość terminów w spisie będzie dotyczyć terminów SQL (przyjmij to założenie). wymień wszystkie interesujące terminy w porządku alfabetycznym (załóżmy, że główne nazwy rozdziałów) i numery stron.

W przypadku pytania typu „Powiedz mi wszystkie rozdziały, pod którymi pojawia się DISTINCT” użyjesz drugiego indeksu. (ponieważ selektywność późniejszego pola jest wysoka)

W przypadku pytania typu „Podaj liczbę terminów, które pojawiają się w pierwszym rozdziale”, użyj spisu treści

Więc w przypadku pytań typu „Czy SELECT jest opisany w rozdziale DML?” możesz użyć dowolnego z indeksów.(ponieważ selektywność obu pól jest wysoka)Jednakże jeśli spis treści samego DML ma 3 strony, a wpis SELECT w indeksie ma tylko piętnaście wierszy, prawdopodobnie przeszedłbyś do drugiego, a to jest przykład, kiedy korzystasz z obu indeksów.

Teraz, jeśli uważasz, że to zbyt daleko idące, weź pod uwagę bazę danych zeskanowanej biblioteki kongresu. :)

Jak powiedziałem wcześniej, całe planowanie jest w porządku, ale na koniec przeprowadź własne testy porównawcze.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL GROUP BY i COUNT

  2. Ponowne łączenie MySQL po przekroczeniu limitu czasu

  3. MySQL, wiele wierszy do oddzielnych pól

  4. Jak wstawić czas 2009-09-22 18:09:37.881 w MYSQL Mój typ kolumny to DateTime

  5. Zduplikowane wiersze MySQL