sql >> Database >  >> RDS >> SQLite

SQLite-index

Samenvatting :in deze zelfstudie leert u hoe u SQLite-indexen gebruikt om sneller gegevens op te vragen, sorteerbewerkingen te versnellen en unieke beperkingen af ​​te dwingen.

Wat is een index?

In relationele databases is een tabel een lijst met rijen. Tegelijkertijd heeft elke rij dezelfde kolomstructuur die uit cellen bestaat. Elke rij heeft ook een opeenvolgend rowid-volgnummer dat wordt gebruikt om de rij te identificeren. Daarom kun je een tabel beschouwen als een lijst van paren:(rowid, row).

In tegenstelling tot een tabel heeft een index een tegenovergestelde relatie:(rij, rowid). Een index is een aanvullende gegevensstructuur die de prestaties van een zoekopdracht helpt verbeteren.

SQLite gebruikt B-tree voor het organiseren van indexen. Merk op dat B staat voor gebalanceerd, B-tree is een gebalanceerde boom, geen binaire boom.

De B-boom houdt de hoeveelheid gegevens aan beide zijden van de boom in evenwicht, zodat het aantal niveaus dat moet worden doorlopen om een ​​rij te lokaliseren altijd ongeveer hetzelfde aantal is. Bovendien zijn query's met behulp van gelijkheid (=) en bereiken (>,>=, <,<=) op de B-tree-indexen zeer efficiënt.

Hoe werkt een index

Elke index moet worden gekoppeld aan een specifieke tabel. Een index bestaat uit een of meer kolommen, maar alle kolommen van een index moeten in dezelfde tabel staan. Een tabel kan meerdere indexen hebben.

Telkens wanneer u een index maakt, maakt SQLite een B-boomstructuur om de indexgegevens te bewaren.

De index bevat gegevens uit de kolommen die u opgeeft in de index en de bijbehorende rowid waarde. Dit helpt SQLite om de rij snel te lokaliseren op basis van de waarden van de geïndexeerde kolommen.

Stel je een index in de database voor als een index van een boek. Door naar de index te kijken, kunt u snel paginanummers identificeren op basis van de trefwoorden.

SQLite CREATE INDEX verklaring

Om een ​​index te maken, gebruik je de CREATE INDEX statement met de volgende syntaxis:

CREATE [UNIQUE] INDEX index_name 
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql)

Om een ​​index te maken, specificeert u drie belangrijke informatie:

  • De naam van de index na de CREATE INDEX trefwoorden.
  • De naam van de tabel hoort bij de index.
  • Een lijst met kolommen van de index.

Als u er zeker van wilt zijn dat waarden in een of meer kolommen uniek zijn, zoals e-mail en telefoon, gebruikt u de UNIQUE optie in de CREATE INDEX uitspraak. De CREATE UNIQUE INDEX creëert een nieuwe unieke index.

SQLite UNIQUE indexvoorbeeld

Laten we een nieuwe tabel maken met de naam contacts voor demonstratie.

CREATE TABLE contacts (
	first_name text NOT NULL,
	last_name text NOT NULL,
	email text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Probeer het

Stel dat u wilt afdwingen dat de e-mail uniek is, dan maakt u als volgt een unieke index:

CREATE UNIQUE INDEX idx_contacts_email 
ON contacts (email);Code language: SQL (Structured Query Language) (sql)

Probeer het

Om dit te testen.

Voeg eerst een rij toe aan de contacts tafel.

INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Probeer het

Ten tweede, voeg nog een rij in met een dubbele e-mail.

INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Probeer het

SQLite gaf een foutmelding die aangeeft dat de unieke index is geschonden. Omdat toen u de tweede rij invoegde, SQLite controleerde en ervoor zorgde dat de e-mail uniek is over alle rijen in email van de contacts tafel.

Laten we nog twee rijen invoegen in de contacts tafel.

INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
      ('Lisa','Smith','[email protected]');Code language: SQL (Structured Query Language) (sql)

Probeer het

Als u gegevens opvraagt ​​van de contacts tabel op basis van een specifieke e-mail, zal SQLite de index gebruiken om de gegevens te lokaliseren. Zie de volgende verklaring:

SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Probeer het

Om te controleren of SQLite de index gebruikt of niet, gebruik je het EXPLAIN QUERY PLAN verklaring als volgt:

EXPLAIN QUERY PLAN 
SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Probeer het

SQLite-voorbeeld van index met meerdere kolommen

Als u een index maakt die uit één kolom bestaat, gebruikt SQLite die kolom als sorteersleutel. Als u een index maakt die meerdere kolommen heeft, gebruikt SQLite de extra kolommen als de tweede, derde, ... als de sorteersleutels.

SQLite sorteert de gegevens op de index met meerdere kolommen op de eerste kolom die is opgegeven in de CREATE INDEX uitspraak. Vervolgens sorteert het de dubbele waarden op de tweede kolom, enzovoort.

Daarom is de kolomvolgorde erg belangrijk wanneer u een index met meerdere kolommen maakt.

Om een ​​index met meerdere kolommen te gebruiken, moet de query de voorwaarde bevatten die dezelfde kolomvolgorde heeft als gedefinieerd in de index.

De volgende instructie creëert een index met meerdere kolommen op de first_name en last_name kolommen van de contacts tafel:

CREATE INDEX idx_contacts_name 
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql)

Probeer het

Als u de contacts . opvraagt tabel met een van de volgende voorwaarden in de WHERE clausule, zal SQLite de index met meerdere kolommen gebruiken om naar gegevens te zoeken.

1) filter gegevens op de first_name kolom.

WHERE
	first_name = 'John';Code language: SQL (Structured Query Language) (sql)

2)filter gegevens op beide first_name en last_name kolommen:

WHERE
	first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

SQLite zal de index met meerdere kolommen echter niet gebruiken als u een van de volgende voorwaarden gebruikt.

1)filter op last_name alleen kolom.

WHERE
	last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

2) filter op first_name OF last_name kolommen.

last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql)

SQLite-indexen weergeven

Om alle indexen te vinden die aan een tabel zijn gekoppeld, gebruikt u de volgende opdracht:

PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)

Deze instructie toont bijvoorbeeld alle indexen van de contacts tafel:

PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql)

Hier is de uitvoer:

Om de informatie over de kolommen in een index te krijgen, gebruikt u het volgende commando:

PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)

Dit voorbeeld retourneert de kolomlijst van de index idx_contacts_name :

Een andere manier om alle indexen uit een database te halen, is door een query uit te voeren op de sqlite_master tafel:

SELECT
   type, 
   name, 
   tbl_name, 
   sql
FROM
   sqlite_master
WHERE
   type= 'index';Code language: SQL (Structured Query Language) (sql)

SQLite DROP INDEX verklaring

Om een ​​index uit een database te verwijderen, gebruikt u de DROP INDEX verklaring als volgt:

DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)

In deze syntaxis specificeert u de naam van de index die u wilt verwijderen na de DROP INDEX trefwoorden. De IF EXISTS optie verwijdert een index alleen als deze bestaat.

U gebruikt bijvoorbeeld de volgende instructie om de idx_contacts_name . te verwijderen index:

DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql)

Probeer het

De idx_contacts_name index wordt volledig uit de database verwijderd.

In deze zelfstudie hebt u geleerd over SQLite-index en hoe u indexen kunt gebruiken om de prestaties van query's te verbeteren of om unieke beperkingen op te leggen.


  1. sqlalchemy.exc.NoSuchModuleError:Kan plug-in niet laden:sqlalchemy.dialects:postgres

  2. Hoe de SQL SUM-functie te gebruiken

  3. SELECT DISTINCT is langzamer dan verwacht op mijn tafel in PostgreSQL

  4. Hoe IPv6 van binair te converteren voor opslag in MySQL