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.