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.