SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Indeks SQLite

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ń.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wiersz aktualizacji Androida SQLite nie działa

  2. Odczytywanie bazy danych z folderu zasobów

  3. Wyjaśnienie SQLite SUBSTRING()

  4. Lepiej użyć adaptera kursora lub adaptera tablicy

  5. SQLite ALTER TABELA