Zusammenfassung :In diesem Tutorial erfahren Sie, wie Sie den ausdrucksbasierten SQLite-Index zum Abfragen von Daten verwenden, um die Abfrageleistung zu verbessern, insbesondere bei Abfragen, die Ausdrücke oder Funktionen verwenden.
Einführung in den ausdrucksbasierten Index von SQLite
Wenn Sie einen Index erstellen, verwenden Sie häufig eine oder mehrere Spalten in einer Tabelle. Neben den normalen Indizes erlaubt Ihnen SQLite, einen Index basierend auf Ausdrücken zu bilden, die Tabellenspalten betreffen. Diese Art von Index wird als ausdrucksbasierter Index bezeichnet.
Die folgende Abfrage wählt die Kunden aus, deren Firmenlänge mehr als 10 Zeichen beträgt.
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
Wenn Sie den EXPLAIN QUERY PLAN
verwenden -Anweisung finden Sie, dass der SQLite-Abfrageplaner die gesamten customers
scannen musste Tabelle, um die Ergebnismenge zurückzugeben.
EXPLAIN QUERY PLAN
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
Der SQLite-Abfrageplaner ist eine Softwarekomponente, die den besten Algorithmus oder Abfrageplan zum Ausführen einer SQL-Anweisung bestimmt. Ab SQLite-Version 3.8.0 wurde die Abfrageplanerkomponente neu geschrieben, um schneller ausgeführt zu werden und bessere Abfragepläne zu generieren. Die Neufassung ist als Abfrageplaner der nächsten Generation oder NGQP bekannt.
Um einen Index basierend auf dem Ausdruck LENGTH(company)
zu erstellen verwenden Sie die folgende Anweisung.
CREATE INDEX customers_length_company
ON customers(LENGTH(company));
Code language: SQL (Structured Query Language) (sql)
Wenn Sie nun die obige Abfrage erneut ausführen, verwendet SQLite den Ausdrucksindex für die Suche, um die Daten auszuwählen, was schneller ist.
Wie der ausdrucksbasierte SQLite-Index funktioniert
Der SQLite-Abfrageplaner verwendet den ausdrucksbasierten Index nur dann, wenn der Ausdruck, den Sie im CREATE INDEX
angegeben haben -Anweisung, sieht genauso aus wie in der WHERE-Klausel oder der ORDER BY-Klausel.
In der Beispieldatenbank haben wir beispielsweise die invoice_items
Tabelle.
Die folgende Anweisung erstellt einen Index mit den Spalten Stückpreis und Menge.
CREATE INDEX invoice_line_amount
ON invoice_items(unitprice*quantity);
Code language: SQL (Structured Query Language) (sql)
Wenn Sie jedoch die folgende Abfrage ausführen:
EXPLAIN QUERY PLAN
SELECT invoicelineid,
invoiceid,
unitprice*quantity
FROM invoice_items
WHERE quantity*unitprice > 10;
Code language: SQL (Structured Query Language) (sql)
Der SQLite-Abfrageplaner hat den Index nicht verwendet, da der Ausdruck in CREATE INDEX
( unitprice*quantity
) ist nicht dasselbe wie das in WHERE
Klausel (Menge*Einheitspreis)
SQLite-Ausdrucksbasierte Indexbeschränkung
Im Folgenden werden alle Einschränkungen für den Ausdruck aufgeführt, der in CREATE INDEX
erscheint Aussage.
- Der Ausdruck muss sich nur auf die Spalten der Tabelle beziehen, die indiziert wird. Sie kann nicht auf die Spalten anderer Tabellen verweisen.
- Der Ausdruck kann nur den deterministischen Funktionsaufruf verwenden.
- Der Ausdruck darf keine Unterabfrage verwenden.
In diesem Lernprogramm haben Sie gelernt, wie Sie den ausdrucksbasierten Index von SQLite verwenden, um die Abfrageleistung zu verbessern.