Sammanfattning :i den här handledningen kommer du att lära dig hur du använder det SQLite-uttrycksbaserade indexet för att fråga data för att förbättra frågeprestanda, särskilt för frågor som använder uttryck eller funktion.
Introduktion till det SQLite-uttrycksbaserade indexet
När du skapar ett index använder du ofta en eller flera kolumner i en tabell. Förutom de normala indexen låter SQLite dig skapa ett index baserat på uttryck som är involverade i tabellkolumner. Denna typ av index kallas ett uttrycksbaserat index.
Följande fråga väljer de kunder vars längd på företaget är längre än 10 tecken.
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
Om du använder EXPLAIN QUERY PLAN
uttalande, kommer du att upptäcka att SQLite-frågeplaneraren var tvungen att skanna hela customers
tabell för att returnera resultatuppsättningen.
EXPLAIN QUERY PLAN
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
SQLite-frågeplaneraren är en mjukvarukomponent som bestämmer den bästa algoritmen eller frågeplanen för att exekvera en SQL-sats. Från och med SQLite version 3.8.0 skrevs frågeplanerarens komponent om för att köras snabbare och generera bättre frågeplaner. Omskrivningen är känd som nästa generations frågeplanerare eller NGQP.
Att skapa ett index baserat på uttrycket LENGTH(company)
, använder du följande påstående.
CREATE INDEX customers_length_company
ON customers(LENGTH(company));
Code language: SQL (Structured Query Language) (sql)
Om du nu kör frågan ovan igen kommer SQLite att använda uttrycksindexet för att söka för att välja data, vilket är snabbare.
Hur det SQLite-uttrycksbaserade indexet fungerar
SQLite-frågeplaneraren använder det uttrycksbaserade indexet endast när uttrycket som du angav i CREATE INDEX
sats, visas på samma sätt som i WHERE-satsen eller ORDER BY-satsen.
I exempeldatabasen har vi till exempel invoice_items
bord.
Följande sats skapar ett index med hjälp av kolumnerna enhetspris och kvantitet.
CREATE INDEX invoice_line_amount
ON invoice_items(unitprice*quantity);
Code language: SQL (Structured Query Language) (sql)
Men när du kör följande fråga:
EXPLAIN QUERY PLAN
SELECT invoicelineid,
invoiceid,
unitprice*quantity
FROM invoice_items
WHERE quantity*unitprice > 10;
Code language: SQL (Structured Query Language) (sql)
SQLite-frågeplaneraren använde inte indexet eftersom uttrycket i CREATE INDEX
( unitprice*quantity
) är inte samma som den i WHERE
klausul (kvantitet*enhetspris)
SQLite-uttrycksbaserad indexbegränsning
Följande listar alla begränsningar för uttrycket som visas i CREATE INDEX
uttalande.
- Uttrycket måste endast referera till kolumnerna i tabellen som indexeras. Den kan inte referera till kolumnerna i andra tabeller.
- Uttrycket kan bara använda det deterministiska funktionsanropet.
- Uttrycket kan inte använda en underfråga.
I den här handledningen har du lärt dig hur du använder det SQLite-uttrycksbaserade indexet för att förbättra frågeprestanda.