Riepilogo :in questo tutorial imparerai come utilizzare gli indici SQLite per interrogare i dati più velocemente, velocizzare le operazioni di ordinamento e applicare vincoli univoci.
Cos'è un indice?
Nei database relazionali, una tabella è un elenco di righe. Allo stesso tempo, ogni riga ha la stessa struttura di colonna composta da celle. Ogni riga ha anche un numero di sequenza rowid consecutivo utilizzato per identificare la riga. Pertanto, puoi considerare una tabella come un elenco di coppie:(riga, riga).
A differenza di una tabella, un indice ha una relazione opposta:(row, rowid). Un indice è una struttura di dati aggiuntiva che aiuta a migliorare le prestazioni di una query.
SQLite utilizza B-tree per organizzare gli indici. Tieni presente che B sta per bilanciato, B-tree è un albero bilanciato, non un albero binario.
L'albero B mantiene bilanciata la quantità di dati su entrambi i lati dell'albero in modo che il numero di livelli che devono essere attraversati per individuare una riga sia sempre nello stesso numero approssimativo. Inoltre, le query utilizzando l'uguaglianza (=) e gli intervalli (>,>=, <,<=) sugli indici dell'albero B sono molto efficienti.
Come funziona un indice
Ogni indice deve essere associato a una tabella specifica. Un indice è costituito da una o più colonne, ma tutte le colonne di un indice devono trovarsi nella stessa tabella. Una tabella può avere più indici.
Ogni volta che crei un indice, SQLite crea una struttura ad albero B per contenere i dati dell'indice.
L'indice contiene i dati delle colonne specificate nell'indice e il corrispondente rowid
valore. Questo aiuta SQLite a individuare rapidamente la riga in base ai valori delle colonne indicizzate.
Immagina un indice nel database come l'indice di un libro. Osservando l'indice, puoi identificare rapidamente i numeri di pagina in base alle parole chiave.
SQLite CREATE INDEX
dichiarazione
Per creare un indice, usa CREATE INDEX
istruzione con la seguente sintassi:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);
Code language: SQL (Structured Query Language) (sql)
Per creare un indice, devi specificare tre informazioni importanti:
- Il nome dell'indice dopo
CREATE INDEX
parole chiave. - Il nome della tabella all'indice appartiene.
- Un elenco di colonne dell'indice.
Nel caso in cui desideri assicurarti che i valori in una o più colonne siano univoci come email e telefono, utilizza UNIQUE
opzione nel CREATE INDEX
dichiarazione. Il CREATE UNIQUE INDEX
crea un nuovo indice univoco.
SQLite UNIQUE
esempio di indice
Creiamo una nuova tabella denominata contacts
per la dimostrazione.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Provalo
Supponiamo di voler imporre che l'e-mail sia univoca, di creare un indice univoco come segue:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);
Code language: SQL (Structured Query Language) (sql)
Provalo
Per testare questo.
Innanzitutto, inserisci una riga nei contacts
tabella.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Provalo
In secondo luogo, inserisci un'altra riga con un'email duplicata.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Provalo
SQLite ha emesso un messaggio di errore indicando che l'indice univoco è stato violato. Perché quando hai inserito la seconda riga, SQLite ha verificato e si è assicurato che l'email fosse univoca tra le righe in email
dei contacts
tabella.
Inseriamo altre due righe nei contacts
tabella.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Provalo
Se richiedi i dati dai contacts
tabella basata su un'e-mail specifica, SQLite utilizzerà l'indice per individuare i dati. Vedi la seguente dichiarazione:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Provalo
Per verificare se SQLite utilizza l'indice o meno, utilizza il EXPLAIN QUERY PLAN
dichiarazione come segue:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Provalo
Esempio di indice multicolonna SQLite
Se crei un indice costituito da una colonna, SQLite utilizza quella colonna come chiave di ordinamento. Nel caso in cui crei un indice con più colonne, SQLite utilizza le colonne aggiuntive come seconda, terza, ... come chiavi di ordinamento.
SQLite ordina i dati sull'indice multicolonna in base alla prima colonna specificata in CREATE INDEX
dichiarazione. Quindi, ordina i valori duplicati in base alla seconda colonna e così via.
Pertanto, l'ordine delle colonne è molto importante quando crei un indice a più colonne.
Per utilizzare un indice multicolonna, la query deve contenere la condizione che ha lo stesso ordine di colonna definito nell'indice.
La seguente istruzione crea un indice multicolonna su first_name
e last_name
colonne dei contacts
tabella:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);
Code language: SQL (Structured Query Language) (sql)
Provalo
Se interroghi i contacts
tabella con una delle seguenti condizioni in WHERE
clausola, SQLite utilizzerà l'indice multicolonna per cercare i dati.
1) filtrare i dati in base al first_name
colonna.
WHERE
first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
2)filtra i dati per entrambi first_name
e last_name
colonne:
WHERE
first_name = 'John' AND last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
Tuttavia, SQLite non utilizzerà l'indice multicolonna se utilizzi una delle seguenti condizioni.
1)filtra per last_name
solo colonna.
WHERE
last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
2) filtra per first_name
OPPURE last_name
colonne.
last_name = 'Doe' OR first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
SQLite Mostra indici
Per trovare tutti gli indici associati a una tabella, utilizzare il comando seguente:
PRAGMA index_list('table_name');
Code language: SQL (Structured Query Language) (sql)
Ad esempio, questa istruzione mostra tutti gli indici dei contacts
tabella:
PRAGMA index_list('playlist_track');
Code language: SQL (Structured Query Language) (sql)
Ecco l'output:
Per ottenere le informazioni sulle colonne in un indice, utilizzare il comando seguente:
PRAGMA index_info('idx_contacts_name');
Code language: SQL (Structured Query Language) (sql)
Questo esempio restituisce l'elenco di colonne dell'indice idx_contacts_name
:
Un altro modo per ottenere tutti gli indici da un database è eseguire una query da sqlite_master
tabella:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';
Code language: SQL (Structured Query Language) (sql)
SQLite DROP INDEX
dichiarazione
Per rimuovere un indice da un database, usa il DROP INDEX
dichiarazione come segue:
DROP INDEX [IF EXISTS] index_name;
Code language: SQL (Structured Query Language) (sql)
In questa sintassi, specifichi il nome dell'indice che vuoi eliminare dopo il DROP INDEX
parole chiave. Il IF EXISTS
l'opzione rimuove un indice solo se esiste.
Ad esempio, utilizzi la seguente istruzione per rimuovere idx_contacts_name
indice:
DROP INDEX idx_contacts_name;
Code language: SQL (Structured Query Language) (sql)
Provalo
Il idx_contacts_name
index viene rimosso completamente dal database.
In questo tutorial, hai appreso l'indice SQLite e come utilizzare gli indici per migliorare le prestazioni delle query o applicare vincoli univoci.