Podsumowanie :w tym samouczku dowiesz się, jak używać indeksów SQLite do szybszego wyszukiwania danych, przyspieszenia operacji sortowania i egzekwowania unikalnych ograniczeń.
Co to jest indeks?
W relacyjnych bazach danych tabela jest listą wierszy. Jednocześnie każdy wiersz ma taką samą strukturę kolumn, która składa się z komórek. Każdy wiersz ma również kolejny numer sekwencji wierszy używany do identyfikacji wiersza. Dlatego możesz traktować tabelę jako listę par:(rowid, row).
W przeciwieństwie do tabeli indeks ma przeciwną relację:(wiersz, wiersz). Indeks to dodatkowa struktura danych, która pomaga poprawić wydajność zapytania.
SQLite używa B-drzewa do organizowania indeksów. Zwróć uwagę, że B oznacza zrównoważone, B-drzewo to zrównoważone drzewo, a nie drzewo binarne.
B-drzewo utrzymuje zrównoważoną ilość danych po obu stronach drzewa, dzięki czemu liczba poziomów, które należy przebyć, aby zlokalizować wiersz, ma zawsze tę samą przybliżoną liczbę. Ponadto wykonywanie zapytań przy użyciu równości (=) i zakresów (>,>=, <,<=) na indeksach B-drzewa jest bardzo wydajne.
Jak działa indeks
Każdy indeks musi być powiązany z określoną tabelą. Indeks składa się z co najmniej jednej kolumny, ale wszystkie kolumny indeksu muszą znajdować się w tej samej tabeli. Tabela może mieć wiele indeksów.
Za każdym razem, gdy tworzysz indeks, SQLite tworzy strukturę B-drzewa do przechowywania danych indeksu.
Indeks zawiera dane z kolumn określonych w indeksie i odpowiadający im rowid wartość. Pomaga to SQLite szybko zlokalizować wiersz na podstawie wartości indeksowanych kolumn.
Wyobraź sobie indeks w bazie danych jak indeks książki. Patrząc na indeks, możesz szybko zidentyfikować numery stron na podstawie słów kluczowych.
SQLite CREATE INDEX oświadczenie
Aby utworzyć indeks, użyj CREATE INDEX oświadczenie o następującej składni:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql) Aby utworzyć indeks, podaj trzy ważne informacje:
- Nazwa indeksu po
CREATE INDEXsłowa kluczowe. - Nazwa tabeli należy do indeksu.
- Lista kolumn indeksu.
Jeśli chcesz mieć pewność, że wartości w jednej lub kilku kolumnach są unikalne, takie jak adres e-mail i telefon, użyj UNIQUE opcja w CREATE INDEX oświadczenie. CREATE UNIQUE INDEX tworzy nowy unikalny indeks.
SQLite UNIQUE przykład indeksu
Stwórzmy nową tabelę o nazwie contacts do demonstracji.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);Code language: SQL (Structured Query Language) (sql) Wypróbuj
Załóżmy, że chcesz wymusić, że e-mail jest unikalny, tworzysz unikalny indeks w następujący sposób:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);Code language: SQL (Structured Query Language) (sql) Wypróbuj
Aby to przetestować.
Najpierw wstaw wiersz do contacts tabela.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Wypróbuj
Po drugie, wstaw kolejny wiersz z duplikatem e-maila.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Wypróbuj
SQLite wysłał komunikat o błędzie wskazujący, że unikalny indeks został naruszony. Ponieważ po wstawieniu drugiego wiersza, SQLite sprawdził i upewnił się, że wiadomość e-mail jest unikalna w wierszach w email z contacts tabela.
Wstawmy jeszcze dwa wiersze do contacts tabela.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','david.brown@sqlitetutorial.net'),
('Lisa','Smith','lisa.smith@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Wypróbuj
Jeśli zapytasz o dane z contacts w oparciu o konkretny adres e-mail, SQLite użyje indeksu do zlokalizowania danych. Zobacz następujące oświadczenie:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) Wypróbuj
Aby sprawdzić, czy SQLite używa indeksu, czy nie, użyj EXPLAIN QUERY PLAN oświadczenie w następujący sposób:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) Wypróbuj
Przykład indeksu wielokolumnowego SQLite
Jeśli tworzysz indeks składający się z jednej kolumny, SQLite używa tej kolumny jako klucza sortowania. W przypadku tworzenia indeksu, który ma wiele kolumn, SQLite używa dodatkowych kolumn jako drugiej, trzeciej... jako kluczy sortowania.
SQLite sortuje dane w indeksie wielokolumnowym według pierwszej kolumny określonej w CREATE INDEX oświadczenie. Następnie sortuje zduplikowane wartości według drugiej kolumny itd.
Dlatego kolejność kolumn jest bardzo ważna podczas tworzenia indeksu wielokolumnowego.
Aby użyć indeksu wielokolumnowego, zapytanie musi zawierać warunek, który ma taką samą kolejność kolumn, jak zdefiniowano w indeksie.
Poniższa instrukcja tworzy indeks wielokolumnowy na first_name i last_name kolumny contacts tabela:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql) Wypróbuj
Jeśli zapytasz contacts tabela z jednym z następujących warunków w WHERE klauzula, SQLite użyje indeksu wielokolumnowego do wyszukiwania danych.
1) filtruj dane według first_name kolumna.
WHERE
first_name = 'John';Code language: SQL (Structured Query Language) (sql)
2) filtruj dane według first_name i last_name kolumny:
WHERE
first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql) Jednak SQLite nie użyje indeksu wielokolumnowego, jeśli użyjesz jednego z poniższych warunków.
1)filtruj według last_name tylko kolumna.
WHERE
last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)
2) filtruj według first_name LUB last_name kolumny.
last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql) Indeksy pokazów SQLite
Aby znaleźć wszystkie indeksy powiązane z tabelą, użyj następującego polecenia:
PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)
Na przykład ta instrukcja pokazuje wszystkie indeksy contacts tabela:
PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql) Oto wynik:
Aby uzyskać informacje o kolumnach w indeksie, użyj następującego polecenia:
PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)
Ten przykład zwraca listę kolumn indeksu idx_contacts_name :
Innym sposobem uzyskania wszystkich indeksów z bazy danych jest zapytanie z sqlite_master tabela:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';Code language: SQL (Structured Query Language) (sql) SQLite DROP INDEX oświadczenie
Aby usunąć indeks z bazy danych, użyj DROP INDEX oświadczenie w następujący sposób:
DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)
W tej składni określasz nazwę indeksu, który chcesz usunąć po DROP INDEX słowa kluczowe. IF EXISTS opcja usuwa indeks tylko jeśli istnieje.
Na przykład możesz użyć następującej instrukcji, aby usunąć idx_contacts_name indeks:
DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql) Wypróbuj
idx_contacts_name indeks zostanie całkowicie usunięty z bazy danych.
W tym samouczku dowiedziałeś się o indeksie SQLite i sposobach wykorzystania indeksów w celu poprawy wydajności zapytań lub wymuszenia unikalnych ograniczeń.