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

Wprowadzenie do indeksów SQL

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.

  1. Z Player tabeli, PlayedID kolumna jednoznacznie identyfikuje każdy wiersz danych. Utwórz Player tabela, po której następuje unikalny indeks w PlayerId 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);
    
  2. Z League tabeli, LeagueId kolumna jednoznacznie identyfikuje każdy wiersz danych. Utwórz League tabeli, po której następuje unikalny indeks na LeagueId 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);
    
  3. Z Membership tabela, zarówno PlayedID i LeagueId kolumny jednoznacznie identyfikują każdy wiersz danych; który jest złożonym kluczem podstawowym. Utwórz Membership tabela, po której następuje unikalny indeks złożony w PlayedID i LeagueId 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.


  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 ładuje wartości NULL z danych CSV

  2. Prawdziwy łańcuch ucieczki i PDO

  3. Podstawy kluczy obcych w MySQL?

  4. Najszybszy sposób na znalezienie odległości między dwoma punktami szerokości/długości

  5. Poznaj MySQL – Tydzień Nowych Technologii