sql >> Database teknologi >  >> RDS >> SQLite

SQLite indeks

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.


  1. Måde man prøve flere SELECT'er, indtil et resultat er tilgængeligt?

  2. Hvordan viser jeg alle kolonnerne i en tabel?

  3. Sådan får du forbindelsesstrengen fra en database

  4. SqlParameter tillader ikke tabelnavn - andre muligheder uden sql-injektionsangreb?