W systemach relacyjnych baz danych indeks bazy danych to niezwykle potężne narzędzie do wyszukiwania danych. W tym przewodniku dowiesz się o unikalnych indeksach, kluczach podstawowych i złożonych kluczach podstawowych.
Co to jest indeks bazy danych?
Indeks bazy danych to obiekt struktury danych powiązany z tabelą bazy danych. Służy do zwiększenia szybkości zapytań do bazy danych (poprzez SQL SELECT
Komenda). Ogólnie rzecz biorąc, istnieją dobrze zdefiniowane metody decydowania o typach indeksów do utworzenia. Jest to w dużej mierze regulowane przez to, w jaki sposób tabele w bazie danych odnoszą się do siebie i jak dane są pobierane.
Dlaczego warto korzystać z indeksów?
Ogólnie zapytania (lub wyszukiwania) w tabeli za pomocą SQL SELECT
polecenia są sekwencyjne. Wyszukiwanie sekwencyjne wymaga rozpoczęcia od góry tabeli i odczytania każdego wiersza danych, aż do pobrania żądanych danych. Jest to niezwykle nieefektywne i może być kosztowną operacją pod względem szybkości.
Z drugiej strony indeksy wykorzystują funkcję skrótu do obliczania wartości indeksu. Zapewnia bezpośredni dostęp do odpowiedniego wiersza (klucza) w indeksie. Gdy ten wiersz (klucz) znajduje się w indeksie, rekord indeksu ma wskaźnik bezpośrednio do wiersza tabeli, który jest wymagany w zapytaniu. Wskaźniki te są ustalane podczas tworzenia i konserwacji indeksu. Szybkość pobierania danych podczas korzystania z indeksów jest zwiększana o rzędy wielkości.
Anatomia unikalnego indeksu bazy danych
Tabela bazy danych może mieć jeden lub więcej powiązanych indeksów. Same indeksy przechowują wartości wierszy (kluczy) z co najmniej jednej kolumny w tabeli. Posiada również wskaźnik wskazujący na rzeczywiste wiersze tabeli zawierające te kluczowe wartości. Liczba wierszy wskazywanych przez dany klucz w indeksie zależy od tego, czy indeks jest indeksem unikalnym lub nieunikalny indeks .
Jak sama nazwa wskazuje, unikalny indeks zawiera klucze, które wskazują tylko jeden wiersz danych w danej tabeli. Unikalne indeksy zapewniają, że każdy wiersz w tabeli zawiera unikalne wartości w zdefiniowanych indeksowanych kolumnach tabeli. W efekcie żadne dwa wiersze nie mogą mieć identycznych wartości w indeksowanych kolumnach. Co więcej, unikalne indeksy są tworzone w kolumnach, które są oznaczone jako klucz podstawowy do stołu. Klucze podstawowe są zdefiniowane jako jedna lub więcej kolumn, które jednoznacznie definiują wiersz w tabeli bazy danych.
Poniższe przykłady pokazują, w jaki sposób klucze podstawowe i unikalne indeksy są używane w SQL. Wszystkie przykłady używają tabeli o nazwie Student
, w przykładowej bazie danych o nazwie exampledb
. Aby dodać przykładowe dane, użyj następującego polecenia:
INSERT INTO Student(SSNumber, LastName, FirstName)
VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);
Wyświetl dane przechowywane w Student
tabela:
SELECT * FROM Student;
Powinieneś zobaczyć następujące wyjście:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith | John |
| 222222222 | Jones | Mary |
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Uwaga O ile nie wspomniano inaczej, wszystkie polecenia w tym przewodniku działają dobrze zarówno na MySQL i PostgreSQL bazy danych.
Klucz podstawowy i indeks pojedynczej kolumny
Jako przykład załóżmy, że szkoła śledzi swoich uczniów w tabeli o nazwie Student
. Ta tabela ma powiązane kolumny o nazwie Student
, SSNumber
, LastName
i FirstName
. Z tych kolumn Student
jest kolumną klucza podstawowego, ponieważ jednoznacznie identyfikuje każdy wiersz danych w Student
stół. Utwórz unikalny indeks (SSIndex
) na SSNumber
kolumna, aby ułatwić szybkie wyszukiwanie danych z tabeli. Do wykonania tego zapytania używane jest następujące polecenie SQL DDL:
CREATE TABLE Student (SSNnumer CHAR(9) NOT NULL,Nazwisko VARCHAR(30) NOT NULL,Imię VARCHAR(20) NOT NULL,PRIMARY KEY (SSNnumer));
CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Uwaga Oba powyższe polecenia SQL są oddzielone średnikiem (;), który jest zgodny z większością relacyjnych systemów baz danych. SSNumber
jest specjalnie wyznaczony jako klucz podstawowy tabeli.
SSIndex
zawiera tylko informacje, które jednoznacznie identyfikują dane w każdym wierszu Student
stół. Każdy wiersz SSIndex
ma wskaźnik do odpowiadającego mu wiersza w Student
stół. Ten SSIndex
indeks pozwala uniknąć sekwencyjnego wyszukiwania danych w tabeli, co poprawia wydajność poprzez minimalizację czasu potrzebnego na wykonanie zapytania.
Aby znaleźć powiązane informacje dla Robert Hansen
poprzez ich SSNumber
, użyj polecenia SQL zawartego poniżej. Polecenie nie tylko eliminuje sekwencyjne wyszukiwanie Student
tabeli, ale używa również SSIndex
aby zapewnić bezpośredni dostęp do wymaganego wiersza danych. Dzieje się tak dzięki użyciu funkcji mieszającej i powiązanego wskaźnika indeksu.
SELECT * FROM Student WHERE SSNumber = 333333333;
Zwracane dane powinny być następujące:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Wielokolumnowy złożony klucz podstawowy i indeks
Przykłady w tej sekcji wykorzystują trzy tabele, które przechowują dane dotyczące ligi tenisowej. Trzy stoły noszą nazwę Player
, League
i Membership
. Gracz może grać w wielu ligach, a tabela członkostwa zapewnia takie powiązanie. Z tymi trzema tabelami są powiązane następujące kolumny:
Kolumny Player
tabela jest wyświetlana poniżej z PlayedID
jako klucz podstawowy.
+----------+-----------+-----------+
| PlayedID | LastName | FirstName |
+----------+-----------+-----------+
Kolumny League
tabela jest wyświetlana poniżej z LeagueId
jako klucz podstawowy.
+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+
Kolumny Membership
tabela jest wyświetlana poniżej
+----------+-----------+
| PlayedID | LeagueId |
+----------+-----------+
Poniższe kroki pokazują, jak utworzyć Player
, League
i Membership
tabele.
-
Z
Player
tabeli,PlayedID
kolumna jednoznacznie identyfikuje każdy wiersz danych. UtwórzPlayer
tabela, po której następuje unikalny indeks wPlayerId
kolumna.CREATE TABLE Player ( PlayedID INT NOT NULL, LastName VARCHAR(30) NOT NULL, FirstName VARCHAR(20) NOT NULL, PRIMARY KEY (PlayedID) ); CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
-
Z
League
tabeli,LeagueId
kolumna jednoznacznie identyfikuje każdy wiersz danych. UtwórzLeague
tabeli, po której następuje unikalny indeks naLeagueId
kolumna. Poniżej znajduje się polecenie SQL do wykonania tej operacji:CREATE TABLE League ( LeagueId INT NOT NULL, LeagueName VARCHAR(50) NOT NULL, SkilLevel VARCHAR(20) NOT NULL, PRIMARY KEY (LeagueId) ); CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
-
Z
Membership
tabela, zarównoPlayedID
iLeagueId
kolumny jednoznacznie identyfikują każdy wiersz danych; który jest złożonym kluczem podstawowym. UtwórzMembership
tabela, po której następuje unikalny indeks złożony wPlayedID
iLeagueId
kolumny.CREATE TABLE Membership ( PlayerId INT NOT NULL, LeagueId INT NOT NULL, PRIMARY KEY(PlayerId, LeagueId) ); CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
MembershipIndex
to indeks generowany przez hash składający się z klucza złożonego (PlayedId
i LeagueId
). Zawiera wskaźniki do wierszy danych, które reprezentuje. Zastosowanie takiego indeksu ułatwia szybkie wyszukiwanie danych z bezpośrednim dostępem, w przeciwieństwie do sekwencyjnego wyszukiwania danych liniowych. Na przykład, aby na podstawie kilku rekordów w każdej z powyższych tabel określić wszystkich graczy powiązanych z „Debelami mężczyzn”, możesz wydać następujące polecenie SQL:
SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId
Zwracane są następujące dane:
+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith | John |
| Hansen | Robert |
+-----------+----------+
Bez użycia MembershipIndex
i PlayerIndex
, powyższe zapytanie wykonałoby się znacznie wolniej.
Nieunikalne indeksy
Nieunikalny indeks zawiera wpisy, które mogą wskazywać na jeden lub więcej wierszy dla dowolnych wartości klucza. Na przykład, aby wyszukiwać według imienia osoby, konieczne jest utworzenie nieunikalnego indeksu złożonego w tabeli dla obu FirstName
i LastName
. Ponieważ kombinacja FirstName
i LastName
nie można zagwarantować, że będzie unikalny, wynikowy indeks utworzony na tych dwóch kolumnach skutecznie generuje nieunikalny indeks.
Problem z degradacją wydajności bazy danych przy użyciu indeksów
Chociaż indeksy przyspieszają wykonywanie zapytań, muszą być aktualizowane za każdym razem, gdy indeksowane kolumny ulegają zmianie lub gdy wiersze tabeli są dodawane lub usuwane z bazy danych. Może to mieć negatywny wpływ na wydajność bazy danych. Ważne jest, aby pamiętać o ilości wstawiania, usuwania i modyfikacji wymaganych indeksów podczas korzystania z transakcyjnej bazy danych. Zastanów się, co jest dla Ciebie ważne w aplikacji bazodanowej; szybkość wykonania zapytania lub szybkość manipulacji danymi. Odpowiedź na to pytanie polega na tym, jak używana jest aplikacja bazodanowa, jak często wpływa ona na projekt bazy danych i liczbę tworzonych indeksów.
Wniosek
Tworzenie i używanie indeksów bazy danych generuje szybkie odpowiedzi na zapytania i eliminuje sekwencyjne wyszukiwania wierszy z tabel. Jednak konserwacja indeksu poprzez manipulowanie danymi może mieć negatywny wpływ na wydajność bazy danych. Projektanci baz danych muszą być świadomi kompromisów związanych z używaniem indeksów bazy danych i pamiętać o optymalizacji ogólnej wydajności bazy danych.