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 INDEX
sł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','[email protected]');
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','[email protected]');
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','[email protected]'),
('Lisa','Smith','[email protected]');
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 = '[email protected]';
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 = '[email protected]';
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ń.