Co to jest indeks w SQL?

440

Co to jest indeks w SQL? Czy możesz wyjaśnić lub odnieść się do jasnego zrozumienia?

Gdzie powinienem użyć indeksu?

Surya sasidhar
źródło

Odpowiedzi:

377

Indeks służy do przyspieszenia wyszukiwania w bazie danych. MySQL ma dobrą dokumentację na ten temat (która dotyczy również innych serwerów SQL): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Za pomocą indeksu można skutecznie znaleźć wszystkie wiersze pasujące do kolumny w zapytaniu, a następnie przejść tylko przez ten podzestaw tabeli, aby znaleźć dokładne dopasowania. Jeśli nie masz indeksów w żadnej kolumnie w WHEREklauzuli, SQLserwer musi przejść przez całą tabelę i sprawdzić każdy wiersz, aby sprawdzić, czy pasuje, co może być powolną operacją w przypadku dużych tabel.

Indeks może być również UNIQUEindeksem, co oznacza, że ​​nie można mieć zduplikowanych wartości w tej kolumnie lub PRIMARY KEYktóry w niektórych silnikach pamięci określa, gdzie w pliku bazy danych wartość jest przechowywana.

W MySQL możesz użyć EXPLAINprzed SELECTinstrukcją, aby sprawdzić, czy twoje zapytanie będzie korzystało z dowolnego indeksu. To dobry początek do rozwiązywania problemów z wydajnością. Przeczytaj więcej tutaj: http://dev.mysql.com/doc/refman/5.0/en/explain.html

Emil Vikström
źródło
„Indeks może być również indeksem UNIQUE ...” Czy to tylko z tobą potwierdzenie, czy oznacza to, że indeks może być również UNIQUE? Zawsze myślałem, że jest to UNIKALNE. Jestem całkiem nowy w SQL, przepraszam
Daniel Kurniadi
@DanielKurniadi Większość indeksów nie jest unikalna. Mogę mieć bazę danych użytkowników i chcę wysyłać zapytania do wszystkich osób mieszkających w Göteborgu. Indeks w polu „miasto” przyspieszyłby moje zapytanie. Ale w Göteborgu mieszka więcej niż 1 użytkownik, więc indeks musi być nieunikalny.
Emil Vikström
174

Indeks klastrowy przypomina zawartość książki telefonicznej. Możesz otworzyć książkę w „Hilditch, David” i znaleźć wszystkie informacje dla wszystkich „Hilditcha” obok siebie. Tutaj kluczami indeksu klastrowego są (nazwisko, imię).

Dzięki temu indeksy klastrowe doskonale nadają się do wyszukiwania dużej ilości danych na podstawie zapytań opartych na zakresie, ponieważ wszystkie dane znajdują się obok siebie.

Ponieważ indeks klastrowany jest faktycznie powiązany ze sposobem przechowywania danych, istnieje tylko jeden z nich możliwy na tabelę (chociaż można oszukiwać, aby symulować wiele indeksów klastrowych).

Indeks nieklastrowany różni się tym, że można mieć wiele z nich, a następnie wskazują one dane w indeksie klastrowym. Możesz mieć np. Indeks nieklastrowany na końcu książki telefonicznej, na której jest wpisane (miasto, adres)

Wyobraź sobie, że musiałbyś przeszukiwać książkę telefoniczną w poszukiwaniu wszystkich osób mieszkających w „Londynie” - tylko z indeksem klastrowym musiałbyś przeszukiwać każdy element w książce telefonicznej, ponieważ klucz w indeksie klastrowym jest włączony (nazwisko, imię), w wyniku czego mieszkańcy Londynu są losowo rozproszeni po całym indeksie.

Jeśli masz indeks nieklastrowany (miasto), zapytania te można wykonać znacznie szybciej.

Mam nadzieję, że to pomaga!

Dave Hilditch
źródło
151

Bardzo dobrą analogią jest myślenie o indeksie bazy danych jak o indeksie w książce. Jeśli masz książkę dotyczącą krajów i szukasz Indii, to dlaczego miałbyś przeglądać całą książkę - co jest odpowiednikiem pełnego skanowania tabeli w terminologii bazy danych - skoro możesz po prostu przejść do indeksu z tyłu książka, która poda dokładne strony, na których można znaleźć informacje o Indiach. Podobnie, ponieważ indeks książki zawiera numer strony, indeks bazy danych zawiera wskaźnik do wiersza zawierającego wartość, której szukasz w kodzie SQL.

Więcej tutaj

Arun Kumar M.
źródło
2
Podziwiam doświadczonych facetów objaśniających różne rzeczy za pomocą „analogii”. +1
snr
82

Indeks służy do przyspieszenia wydajności zapytań. Robi to poprzez zmniejszenie liczby stron danych bazy danych, które należy odwiedzić / zeskanować.

W SQL Server indeks klastrowy określa fizyczną kolejność danych w tabeli. Może istnieć tylko jeden indeks klastrowany na tabelę (indeks klastrowany JEST tabelą). Wszystkie pozostałe indeksy w tabeli są określane jako nieklastrowane.

Mitch Pszenica
źródło
49

Indeksy dotyczą szybkiego wyszukiwania danych .

Indeksy w bazie danych są analogiczne do indeksów znajdujących się w książce. Jeśli książka ma indeks, a ja proszę o znalezienie rozdziału w tej książce, możesz go szybko znaleźć za pomocą tego indeksu. Z drugiej strony, jeśli książka nie ma indeksu, będziesz musiał poświęcić więcej czasu na szukanie rozdziału, patrząc na każdą stronę od początku do końca książki.

W podobny sposób indeksy w bazie danych mogą pomóc zapytaniom w szybkim znajdowaniu danych. Jeśli jesteś nowy w indeksach, poniższe filmy mogą być bardzo przydatne. Wiele się od nich nauczyłem.

Podstawy
indeksów Indeksy klastrowane i nieklastrowane Indeksy
unikalne i nie unikalne
Zalety i wady indeksów

Suresh
źródło
Po przeczytaniu wszystkich odpowiedzi zastanawiałem się, dlaczego nie indeksować wszystkiego. +1 za dołączenie linku zawierającego wady.
Lakshay Garg
@LakshayGarg Czasami niepotrzebne indeksowanie może również spowolnić czas wykonywania zapytania, więc nie powinniśmy próbować indeksować wszystkiego. Tak jak wszystko ma swoje zalety i wady.
Gaurav Rajdeo
@LakshayGarg Gaurav Rajdeo ma rację. Zbyt zachowaj tę samą analogię: możesz indeksować każdy rozdział, rysunek lub tabelę w książce, ale nie każdy akapit, zdanie lub słowo. Zwykle byłoby to przesadą i doprowadziłoby do niepotrzebnych komplikacji. Mam nadzieję, że jest to wystarczająco blisko do narysowanego obrazu w tej odpowiedzi.
colidyre 30.09.19
23

Cóż, ogólny indeks to B-tree. Istnieją dwa typy indeksów: klastrowany i nieklastrowany.

Indeks klastrowy tworzy fizyczną kolejność wierszy (może być tylko jeden, aw większości przypadków jest to również klucz podstawowy - jeśli tworzysz klucz podstawowy w tabeli, tworzysz również indeks klastrowany w tej tabeli).

Indeks nieklastrowany jest również drzewem binarnym, ale nie tworzy fizycznej kolejności wierszy. Zatem węzły liści indeksu nieklastrowanego zawierają PK (jeśli istnieje) lub indeks wiersza.

Indeksy służą do zwiększenia szybkości wyszukiwania. Ponieważ złożoność wynosi O (log N). Indeksy to bardzo duży i interesujący temat. Mogę powiedzieć, że tworzenie indeksów na dużej bazie danych jest czasem sztuką.

Głos
źródło
6
ogólnie jest to b-drzewo, a nie drzewo binarne.
Mitch Wheat
dlatego, że indeksy używają drzew równoważących się, za każdym razem, gdy dodajesz / usuwasz wiersz, sam się równoważy - co powoduje, że wstawianie / usuwanie jest droższe ... prawda?
David Refaeli,
20

INDEXES - aby łatwo znaleźć dane

UNIQUE INDEX - zduplikowane wartości nie są dozwolone

Składnia dla INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Składnia dla UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
RAGU
źródło
13

Najpierw musimy zrozumieć, jak działa normalne (bez indeksowania) zapytanie. Zasadniczo przemierza każdy wiersz jeden po drugim, a gdy znajdzie dane, zwraca. Zobacz następujący obraz. (To zdjęcie zostało zaczerpnięte z tego filmu ).

Bez indeksowania Załóżmy więc, że zapytanie polega na znalezieniu 50, będzie musiał odczytać 49 rekordów jako wyszukiwanie liniowe.

Zobacz następujący obraz. (To zdjęcie pochodzi z tego filmu )

wprowadź opis zdjęcia tutaj

Gdy zastosujemy indeksowanie, zapytanie szybko odnajdzie dane bez odczytywania każdego z nich, po prostu eliminując połowę danych w każdym przejściu, jak wyszukiwanie binarne. Indeksy mysql są przechowywane jako B-drzewo, gdzie wszystkie dane znajdują się w węźle liścia.

Kravi
źródło
12

INDEKS to technika optymalizacji wydajności, która przyspiesza proces pobierania danych. Jest to trwała struktura danych powiązana z tabelą (lub widokiem) w celu zwiększenia wydajności podczas pobierania danych z tej tabeli (lub widoku).

Wyszukiwanie oparte na indeksach jest stosowane w szczególności, gdy zapytania zawierają filtr GDZIE. W przeciwnym razie, tzn. Zapytanie bez WHERE-filter wybiera całe dane i proces. Przeszukiwanie całej tabeli bez INDEKSU nazywa się Skanowaniem tabeli.

Znajdziesz dokładne informacje na temat indeksów Sql w jasny i niezawodny sposób: skorzystaj z poniższych linków:

  1. Dla zrozumienia mądrego: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Dla zrozumienia pod względem implementacji: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html
nayeemDotNetAuthorities
źródło
6

Indeks jest używany do różnych powodów. Głównym powodem jest przyspieszenie zapytań, abyś mógł szybciej uzyskiwać lub sortować wiersze. Innym powodem jest zdefiniowanie klucza podstawowego lub indeksu unikalnego, który zagwarantuje, że żadne inne kolumny nie będą miały takich samych wartości.

Rozsądny
źródło
6

Jeśli używasz programu SQL Server, jednym z najlepszych zasobów są własne książki online, które są dostarczane wraz z instalacją! Jest to pierwsze miejsce, do którego odniosę się w DOWOLNYM temacie związanym z SQL Server.

Jeśli to praktyczne „jak mam to zrobić?” rodzaj pytań, to StackOverflow byłoby lepszym miejscem do zadawania pytań.

Poza tym nie byłem jeszcze przez jakiś czas, ale witryna sqlservercentral.com była jedną z najpopularniejszych witryn związanych z programem SQL Server.

cloneofsnake
źródło
0

Indeks to on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Indeks zawiera klucze zbudowane z jednej lub więcej kolumn w tabeli lub widoku. Te klucze są przechowywane w strukturze (B-drzewo), która umożliwia programowi SQL Server szybkie i wydajne znalezienie wiersza lub wierszy powiązanych z wartościami klucza.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Jeśli skonfigurujesz KLUCZ PODSTAWOWY, aparat bazy danych automatycznie tworzy indeks klastrowany, chyba że indeks klastrowany już istnieje. Podczas próby wymuszenia ograniczenia klucza podstawowego na istniejącej tabeli, a indeks tabeli klastrowej już istnieje w tej tabeli, program SQL Server wymusza klucz podstawowy za pomocą indeksu nieklastrowanego.

Więcej informacji na temat indeksów (klastrowanych i nieklastrowanych): https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-description?view= sql-server-ver15

Mam nadzieję że to pomoże!

adSad
źródło