sql >> Databasteknik >  >> RDS >> SQLite

SQLite Index

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.


  1. Hur man replikerar PostgreSQL-data till fjärrwebbplatser

  2. node-mysql flera satser i en fråga

  3. Hur man anger primärnyckelnamn i EF-Code-First

  4. Adaptiv dynamisk statistik dödar prestanda i 12.1.0.2 RAC