Sammanfattning :i den här handledningen kommer du att lära dig hur du använder SQLite-index för att söka efter data snabbare, påskynda sorteringsoperationen och upprätthålla unika begränsningar.
Vad är ett index?
I relationsdatabaser är en tabell en lista med rader. Samtidigt har varje rad samma kolumnstruktur som består av celler. Varje rad har också ett på varandra följande rad sekvensnummer som används för att identifiera raden. Därför kan du betrakta en tabell som en lista med par:(rad, rad).
Till skillnad från en tabell har ett index ett motsatt förhållande:(rad, rowid). Ett index är en ytterligare datastruktur som hjälper till att förbättra prestandan för en fråga.
SQLite använder B-träd för att organisera index. Observera att B står för balanserad, B-träd är ett balanserat träd, inte ett binärt träd.
B-trädet håller mängden data på båda sidor av trädet balanserad så att antalet nivåer som måste passeras för att lokalisera en rad alltid är i samma ungefärliga antal. Dessutom är det mycket effektivt att söka med jämlikhet (=) och intervall (>,>=, <,<=) på B-trädets index.
Hur fungerar ett index
Varje index måste vara associerat med en specifik tabell. Ett index består av en eller flera kolumner, men alla kolumner i ett index måste finnas i samma tabell. En tabell kan ha flera index.
När du skapar ett index skapar SQLite en B-trädstruktur för att hålla indexdata.
Indexet innehåller data från kolumnerna som du anger i indexet och motsvarande rowid
värde. Detta hjälper SQLite att snabbt hitta raden baserat på värdena för de indexerade kolumnerna.
Föreställ dig ett register i databasen som ett register över en bok. Genom att titta på indexet kan du snabbt identifiera sidnummer baserat på sökorden.
SQLite CREATE INDEX
uttalande
För att skapa ett index använder du CREATE INDEX
uttalande med följande syntax:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);
Code language: SQL (Structured Query Language) (sql)
För att skapa ett index anger du tre viktiga uppgifter:
- Namnet på indexet efter
CREATE INDEX
sökord. - Namnet på tabellen till indexet tillhör.
- En lista med kolumner i indexet.
Om du vill försäkra dig om att värden i en eller flera kolumner är unika som e-post och telefon, använder du UNIQUE
alternativet i CREATE INDEX
påstående. CREATE UNIQUE INDEX
skapar ett nytt unikt index.
SQLite UNIQUE
indexexempel
Låt oss skapa en ny tabell med namnet contacts
för 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)
Prova det
Anta att du vill framtvinga att e-postmeddelandet är unikt, skapar du ett unikt index enligt följande:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);
Code language: SQL (Structured Query Language) (sql)
Prova det
För att testa detta.
Först infogar du en rad i contacts
bord.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Prova det
För det andra, infoga en annan rad med en dubblett av e-postmeddelandet.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Prova det
SQLite utfärdade ett felmeddelande som indikerar att det unika indexet har brutits. För när du infogade den andra raden kontrollerade SQLite och såg till att e-postmeddelandet är unikt över raderna i email
av contacts
bord.
Låt oss infoga ytterligare två rader i contacts
bord.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Prova det
Om du frågar efter data från contacts
tabell baserat på ett specifikt e-postmeddelande kommer SQLite att använda indexet för att lokalisera data. Se följande uttalande:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Prova det
För att kontrollera om SQLite använder indexet eller inte använder du EXPLAIN QUERY PLAN
uttalande enligt följande:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Prova det
Exempel på SQLite-flerkolumnindex
Om du skapar ett index som består av en kolumn, använder SQLite den kolumnen som sorteringsnyckel. Om du skapar ett index som har flera kolumner, använder SQLite de ytterligare kolumnerna som den andra, tredje, … som sorteringsnycklar.
SQLite sorterar data på flerkolumnsindex efter den första kolumnen som anges i CREATE INDEX
påstående. Sedan sorterar den dubblettvärdena efter den andra kolumnen, och så vidare.
Därför är kolumnordningen mycket viktig när du skapar ett index med flera kolumner.
För att använda ett index med flera kolumner måste frågan innehålla villkoret som har samma kolumnordning som definierats i indexet.
Följande sats skapar ett index med flera kolumner på first_name
och last_name
kolumner i contacts
tabell:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);
Code language: SQL (Structured Query Language) (sql)
Prova det
Om du frågar contacts
tabellen med ett av följande villkor i WHERE
kommer SQLite att använda flerkolumnindex för att söka efter data.
1) filtrera data efter first_name
kolumn.
WHERE
first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
2)filtrera data efter båda first_name
och last_name
kolumner:
WHERE
first_name = 'John' AND last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
SQLite kommer dock inte att använda flerkolumnsindexet om du använder något av följande villkor.
1)filtrera efter last_name
endast kolumn.
WHERE
last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
2) filtrera efter first_name
ELLER last_name
kolumner.
last_name = 'Doe' OR first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
SQLite Visa index
För att hitta alla index som är associerade med en tabell använder du följande kommando:
PRAGMA index_list('table_name');
Code language: SQL (Structured Query Language) (sql)
Till exempel visar detta uttalande alla index för contacts
tabell:
PRAGMA index_list('playlist_track');
Code language: SQL (Structured Query Language) (sql)
Här är resultatet:
För att få information om kolumnerna i ett index använder du följande kommando:
PRAGMA index_info('idx_contacts_name');
Code language: SQL (Structured Query Language) (sql)
Det här exemplet returnerar kolumnlistan för indexet idx_contacts_name
:
Ett annat sätt att hämta alla index från en databas är att fråga från sqlite_master
tabell:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';
Code language: SQL (Structured Query Language) (sql)
SQLite DROP INDEX
uttalande
För att ta bort ett index från en databas använder du DROP INDEX
uttalande enligt följande:
DROP INDEX [IF EXISTS] index_name;
Code language: SQL (Structured Query Language) (sql)
I den här syntaxen anger du namnet på indexet som du vill ta bort efter DROP INDEX
nyckelord. IF EXISTS
alternativet tar bara bort ett index om det finns.
Till exempel använder du följande uttalande för att ta bort idx_contacts_name
index:
DROP INDEX idx_contacts_name;
Code language: SQL (Structured Query Language) (sql)
Prova det
idx_contacts_name
index tas bort helt från databasen.
I den här handledningen har du lärt dig om SQLite-index och hur du använder index för att förbättra prestandan för en fråga eller genomdriva unika begränsningar.