Oversigt :i denne øvelse lærer du, hvordan du bruger SQLite-indekser til at forespørge data hurtigere, fremskynde sorteringsoperationen og håndhæve unikke begrænsninger.
Hvad er et indeks?
I relationelle databaser er en tabel en liste over rækker. På samme tid har hver række den samme kolonnestruktur, der består af celler. Hver række har også et fortløbende rækkefølgenummer, der bruges til at identificere rækken. Derfor kan du betragte en tabel som en liste over par:(række, række).
I modsætning til en tabel har et indeks et modsat forhold:(række, række). Et indeks er en ekstra datastruktur, der hjælper med at forbedre ydeevnen af en forespørgsel.
SQLite bruger B-træ til at organisere indekser. Bemærk, at B står for balanceret, B-træ er et balanceret træ, ikke et binært træ.
B-træet holder mængden af data på begge sider af træet afbalanceret, så antallet af niveauer, der skal gennemløbes for at finde en række, altid er i det samme omtrentlige antal. Derudover er forespørgsler ved hjælp af lighed (=) og intervaller (>,>=, <,<=) på B-træets indekser meget effektive.
Hvordan fungerer et indeks
Hvert indeks skal være knyttet til en bestemt tabel. Et indeks består af en eller flere kolonner, men alle kolonner i et indeks skal være i samme tabel. En tabel kan have flere indekser.
Hver gang du opretter et indeks, opretter SQLite en B-træstruktur til at opbevare indeksdataene.
Indekset indeholder data fra de kolonner, som du angiver i indekset og den tilsvarende rowid værdi. Dette hjælper SQLite med hurtigt at finde rækken baseret på værdierne af de indekserede kolonner.
Forestil dig et indeks i databasen som et indeks over en bog. Ved at se på indekset kan du hurtigt identificere sidetal ud fra søgeordene.
SQLite CREATE INDEX erklæring
For at oprette et indeks bruger du CREATE INDEX sætning med følgende syntaks:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql) For at oprette et indeks skal du angive tre vigtige oplysninger:
- Navnet på indekset efter
CREATE INDEXsøgeord. - Navnet på tabellen til indekset tilhører.
- En liste over kolonner i indekset.
Hvis du vil sikre dig, at værdier i en eller flere kolonner er unikke som e-mail og telefon, skal du bruge UNIQUE mulighed i CREATE INDEX udmelding. CREATE UNIQUE INDEX opretter et nyt unikt indeks.
SQLite UNIQUE indekseksempel
Lad os oprette en ny tabel med navnet contacts til 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) Prøv det
Antag, at du vil håndhæve, at e-mailen er unik, opretter du et unikt indeks som følger:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);Code language: SQL (Structured Query Language) (sql) Prøv det
For at teste dette.
Først skal du indsætte en række i contacts tabel.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Prøv det
For det andet skal du indsætte en anden række med en dublet e-mail.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Prøv det
SQLite udsendte en fejlmeddelelse, der indikerer, at det unikke indeks er blevet overtrådt. For da du indsatte den anden række, tjekkede SQLite og sørgede for, at e-mailen er unik på tværs af rækker i email af contacts tabel.
Lad os indsætte to rækker mere i contacts tabel.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','david.brown@sqlitetutorial.net'),
('Lisa','Smith','lisa.smith@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Prøv det
Hvis du forespørger data fra contacts tabel baseret på en specifik e-mail, vil SQLite bruge indekset til at finde dataene. Se følgende erklæring:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) Prøv det
For at kontrollere, om SQLite bruger indekset eller ej, bruger du EXPLAIN QUERY PLAN erklæring som følger:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) Prøv det
Eksempel på SQLite-flerkolonneindeks
Hvis du opretter et indeks, der består af én kolonne, bruger SQLite den kolonne som sorteringsnøgle. Hvis du opretter et indeks, der har flere kolonner, bruger SQLite de ekstra kolonner som den anden, tredje, … som sorteringsnøgler.
SQLite sorterer dataene på multikolonneindekset efter den første kolonne angivet i CREATE INDEX udmelding. Derefter sorterer den de duplikerede værdier efter den anden kolonne, og så videre.
Derfor er kolonnerækkefølgen meget vigtig, når du opretter et indeks med flere kolonner.
For at bruge et indeks med flere kolonner, skal forespørgslen indeholde den betingelse, der har samme kolonnerækkefølge som defineret i indekset.
Følgende sætning opretter et multikolonneindeks på first_name og last_name kolonner i contacts tabel:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql) Prøv det
Hvis du forespørger på contacts tabel med en af følgende betingelser i WHERE klausul, vil SQLite bruge multikolonneindekset til at søge efter data.
1) filtrer data efter first_name kolonne.
WHERE
first_name = 'John';Code language: SQL (Structured Query Language) (sql)
2)filtrer data efter både first_name og last_name kolonner:
WHERE
first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql) SQLite vil dog ikke bruge multikolonneindekset, hvis du bruger en af følgende betingelser.
1)filtrer efter last_name kun kolonne.
WHERE
last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)
2) filtrer efter first_name ELLER last_name kolonner.
last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql) SQLite Vis indekser
For at finde alle indekser tilknyttet en tabel, bruger du følgende kommando:
PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)
For eksempel viser denne erklæring alle indekser for contacts tabel:
PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql) Her er outputtet:
For at få information om kolonnerne i et indeks, bruger du følgende kommando:
PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)
Dette eksempel returnerer kolonnelisten for indekset idx_contacts_name :
En anden måde at få alle indekser fra en database på er at forespørge fra sqlite_master tabel:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';Code language: SQL (Structured Query Language) (sql) SQLite DROP INDEX erklæring
For at fjerne et indeks fra en database, bruger du DROP INDEX erklæring som følger:
DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)
I denne syntaks angiver du navnet på det indeks, som du vil droppe efter DROP INDEX søgeord. IF EXISTS option fjerner kun et indeks, hvis det findes.
For eksempel bruger du følgende sætning til at fjerne idx_contacts_name indeks:
DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql) Prøv det
idx_contacts_name indeks fjernes fuldstændigt fra databasen.
I denne øvelse har du lært om SQLite-indeks og hvordan du bruger indekser til at forbedre forespørgsels ydeevne eller håndhæve unikke begrænsninger.