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 INDEX
sø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','[email protected]');
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','[email protected]');
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','[email protected]'),
('Lisa','Smith','[email protected]');
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 = '[email protected]';
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 = '[email protected]';
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.