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

Indice SQLite

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.