SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite-Index

Zusammenfassung :In diesem Tutorial erfahren Sie, wie Sie SQLite-Indizes verwenden, um Daten schneller abzufragen, Sortiervorgänge zu beschleunigen und Unique Constraints durchzusetzen.

Was ist ein Index?

In relationalen Datenbanken ist eine Tabelle eine Liste von Zeilen. Gleichzeitig hat jede Zeile die gleiche Spaltenstruktur, die aus Zellen besteht. Jede Zeile hat auch eine fortlaufende Zeilen-ID-Folgenummer, die verwendet wird, um die Zeile zu identifizieren. Daher können Sie eine Tabelle als eine Liste von Paaren betrachten:(rowid, row).

Im Gegensatz zu einer Tabelle hat ein Index eine umgekehrte Beziehung:(row, rowid). Ein Index ist eine zusätzliche Datenstruktur, die hilft, die Leistung einer Abfrage zu verbessern.

SQLite verwendet B-Tree zum Organisieren von Indizes. Beachten Sie, dass B steht für ausgeglichen, B-Baum ist ein ausgeglichener Baum, kein binärer Baum.

Der B-Baum hält die Datenmenge auf beiden Seiten des Baums im Gleichgewicht, so dass die Anzahl der Ebenen, die durchlaufen werden müssen, um eine Zeile zu lokalisieren, immer ungefähr dieselbe Anzahl ist. Darüber hinaus sind Abfragen mit Gleichheit (=) und Bereichen (>,>=, <, <=) in den B-Tree-Indizes sehr effizient.

Wie funktioniert ein Index

Jeder Index muss einer bestimmten Tabelle zugeordnet werden. Ein Index besteht aus einer oder mehreren Spalten, aber alle Spalten eines Index müssen sich in derselben Tabelle befinden. Eine Tabelle kann mehrere Indizes haben.

Immer wenn Sie einen Index erstellen, erstellt SQLite eine B-Baumstruktur, um die Indexdaten zu speichern.

Der Index enthält Daten aus den Spalten, die Sie im Index angeben, und die entsprechende rowid Wert. Dies hilft SQLite, die Zeile basierend auf den Werten der indizierten Spalten schnell zu finden.

Stellen Sie sich einen Index in der Datenbank wie einen Index eines Buches vor. Wenn Sie sich den Index ansehen, können Sie anhand der Schlüsselwörter schnell Seitenzahlen identifizieren.

SQLite CREATE INDEX Aussage

Um einen Index zu erstellen, verwenden Sie den CREATE INDEX Anweisung mit der folgenden Syntax:

CREATE [UNIQUE] INDEX index_name 
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql)

Um einen Index zu erstellen, geben Sie drei wichtige Informationen an:

  • Der Name des Index nach CREATE INDEX Schlüsselwörter.
  • Der Name der Tabelle die zum Index gehört.
  • Eine Liste von Spalten des Indexes.

Falls Sie sicherstellen möchten, dass Werte in einer oder mehreren Spalten wie E-Mail und Telefon eindeutig sind, verwenden Sie den UNIQUE Option im CREATE INDEX Erklärung. Der CREATE UNIQUE INDEX erstellt einen neuen eindeutigen Index.

SQLite UNIQUE Indexbeispiel

Lassen Sie uns eine neue Tabelle mit dem Namen contacts erstellen zur Demonstration.

CREATE TABLE contacts (
	first_name text NOT NULL,
	last_name text NOT NULL,
	email text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Angenommen, Sie möchten erzwingen, dass die E-Mail eindeutig ist, erstellen Sie wie folgt einen eindeutigen Index:

CREATE UNIQUE INDEX idx_contacts_email 
ON contacts (email);Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Um dies zu testen.

Fügen Sie zuerst eine Zeile in die contacts ein Tabelle.

INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Zweitens fügen Sie eine weitere Zeile mit einer doppelten E-Mail ein.

INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

SQLite hat eine Fehlermeldung ausgegeben, die darauf hinweist, dass der eindeutige Index verletzt wurde. Denn als Sie die zweite Zeile eingefügt haben, hat SQLite überprüft und sichergestellt, dass die E-Mail in allen Zeilen in email eindeutig ist der contacts Tabelle.

Lassen Sie uns zwei weitere Zeilen in die contacts einfügen Tabelle.

INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
      ('Lisa','Smith','[email protected]');Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Wenn Sie Daten aus den contacts abfragen Tabelle basierend auf einer bestimmten E-Mail, verwendet SQLite den Index, um die Daten zu finden. Siehe folgende Anweisung:

SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Um zu überprüfen, ob SQLite den Index verwendet oder nicht, verwenden Sie den EXPLAIN QUERY PLAN Anweisung wie folgt:

EXPLAIN QUERY PLAN 
SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Beispiel für einen mehrspaltigen SQLite-Index

Wenn Sie einen Index erstellen, der aus einer Spalte besteht, verwendet SQLite diese Spalte als Sortierschlüssel. Falls Sie einen Index mit mehreren Spalten erstellen, verwendet SQLite die zusätzlichen Spalten als zweite, dritte, … als Sortierschlüssel.

SQLite sortiert die Daten im mehrspaltigen Index nach der ersten Spalte, die im CREATE INDEX angegeben ist Erklärung. Dann sortiert es die doppelten Werte nach der zweiten Spalte und so weiter.

Daher ist die Spaltenreihenfolge sehr wichtig, wenn Sie einen mehrspaltigen Index erstellen.

Um einen mehrspaltigen Index zu verwenden, muss die Abfrage die Bedingung enthalten, die dieselbe Spaltenreihenfolge wie im Index definiert hat.

Die folgende Anweisung erstellt einen mehrspaltigen Index für first_name und last_name Spalten der contacts Tabelle:

CREATE INDEX idx_contacts_name 
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Wenn Sie die contacts abfragen Tabelle mit einer der folgenden Bedingungen im WHERE -Klausel verwendet SQLite den mehrspaltigen Index, um nach Daten zu suchen.

1) Daten nach first_name filtern Spalte.

WHERE
	first_name = 'John';Code language: SQL (Structured Query Language) (sql)

2) Daten sowohl nach first_name filtern und last_name Spalten:

WHERE
	first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

Allerdings verwendet SQLite den mehrspaltigen Index nicht, wenn Sie eine der folgenden Bedingungen verwenden.

1) nach last_name filtern nur Spalte.

WHERE
	last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

2) Filtern nach first_name ODER last_name Spalten.

last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql)

SQLite-Indizes anzeigen

Um alle einer Tabelle zugeordneten Indizes zu finden, verwenden Sie den folgenden Befehl:

PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)

Diese Anweisung zeigt beispielsweise alle Indizes der contacts Tabelle:

PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql)

Hier ist die Ausgabe:

Um die Informationen über die Spalten in einem Index abzurufen, verwenden Sie den folgenden Befehl:

PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)

Dieses Beispiel gibt die Spaltenliste des Indexes idx_contacts_name zurück :

Eine andere Möglichkeit, alle Indizes aus einer Datenbank zu erhalten, ist die Abfrage von sqlite_master Tabelle:

SELECT
   type, 
   name, 
   tbl_name, 
   sql
FROM
   sqlite_master
WHERE
   type= 'index';Code language: SQL (Structured Query Language) (sql)

SQLite DROP INDEX Aussage

Um einen Index aus einer Datenbank zu entfernen, verwenden Sie den DROP INDEX Anweisung wie folgt:

DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)

In dieser Syntax geben Sie den Namen des Indexes an, den Sie nach DROP INDEX löschen möchten Schlüsselwörter. Der IF EXISTS Option entfernt einen Index nur, wenn er existiert.

Sie verwenden beispielsweise die folgende Anweisung, um den idx_contacts_name zu entfernen index:

DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql)

Probieren Sie es aus

Der idx_contacts_name Index wird vollständig aus der Datenbank entfernt.

In diesem Lernprogramm haben Sie den SQLite-Index kennengelernt und erfahren, wie Sie Indizes verwenden, um die Leistung von Abfragen zu verbessern oder eindeutige Einschränkungen zu erzwingen.