SQLite
 sql >> Base de données >  >> RDS >> SQLite

Index SQLite

Résumé  :dans ce didacticiel, vous apprendrez à utiliser les index SQLite pour interroger les données plus rapidement, accélérer l'opération de tri et appliquer des contraintes uniques.

Qu'est-ce qu'un index ?

Dans les bases de données relationnelles, une table est une liste de lignes. Dans le même temps, chaque ligne a la même structure de colonne composée de cellules. Chaque ligne a également un numéro de séquence rowid consécutif utilisé pour identifier la ligne. Par conséquent, vous pouvez considérer une table comme une liste de paires :(rowid, row).

Contrairement à une table, un index a une relation opposée :(row, rowid). Un index est une structure de données supplémentaire qui permet d'améliorer les performances d'une requête.

SQLite utilise B-tree pour organiser les index. Notez que B signifie équilibré, B-tree est un arbre équilibré, pas un arbre binaire.

L'arbre B maintient la quantité de données des deux côtés de l'arbre équilibrée de sorte que le nombre de niveaux qui doivent être traversés pour localiser une ligne soit toujours dans le même nombre approximatif. De plus, les requêtes utilisant l'égalité (=) et les plages (>,>=, <,<=) sur les index B-tree sont très efficaces.

Comment fonctionne un index

Chaque index doit être associé à une table spécifique. Un index se compose d'une ou plusieurs colonnes, mais toutes les colonnes d'un index doivent se trouver dans la même table. Une table peut avoir plusieurs index.

Chaque fois que vous créez un index, SQLite crée une structure B-tree pour contenir les données de l'index.

L'index contient les données des colonnes que vous spécifiez dans l'index et le rowid correspondant valeur. Cela aide SQLite à localiser rapidement la ligne en fonction des valeurs des colonnes indexées.

Imaginez un index dans la base de données comme un index d'un livre. En consultant l'index, vous pouvez identifier rapidement les numéros de page en fonction des mots-clés.

SQLite CREATE INDEX déclaration

Pour créer un index, vous utilisez le CREATE INDEX déclaration avec la syntaxe suivante :

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

Pour créer un index, vous spécifiez trois informations importantes :

  • Le nom de l'index après le CREATE INDEX mots-clés.
  • Le nom de la table à l'index appartient.
  • Une liste des colonnes de l'index.

Si vous voulez vous assurer que les valeurs d'une ou plusieurs colonnes sont uniques comme l'e-mail et le téléphone, vous utilisez le UNIQUE option dans le CREATE INDEX déclaration. Le CREATE UNIQUE INDEX crée un nouvel index unique.

SQLite UNIQUE exemple d'index

Créons une nouvelle table nommée contacts pour démonstration.

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

Essayez-le

Supposons que vous souhaitiez imposer l'unicité de l'e-mail, vous créez un index unique comme suit :

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

Essayez-le

Pour tester ça.

Tout d'abord, insérez une ligne dans les contacts tableau.

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

Essayez-le

Deuxièmement, insérez une autre ligne avec un e-mail en double.

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

Essayez-le

SQLite a émis un message d'erreur indiquant que l'index unique a été violé. Parce que lorsque vous avez inséré la deuxième ligne, SQLite a vérifié et s'est assuré que l'e-mail est unique sur toutes les lignes dans email des contacts tableau.

Insérons deux lignes supplémentaires dans les contacts tableau.

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

Essayez-le

Si vous interrogez les données des contacts table basée sur un e-mail spécifique, SQLite utilisera l'index pour localiser les données. Voir la déclaration suivante :

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

Essayez-le

Pour vérifier si SQLite utilise l'index ou non, vous utilisez le EXPLAIN QUERY PLAN déclaration comme suit :

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

Essayez-le

Exemple d'index multicolonne SQLite

Si vous créez un index composé d'une colonne, SQLite utilise cette colonne comme clé de tri. Dans le cas où vous créez un index qui a plusieurs colonnes, SQLite utilise les colonnes supplémentaires comme deuxième, troisième, … comme clés de tri.

SQLite trie les données sur l'index multicolonne par la première colonne spécifiée dans le CREATE INDEX déclaration. Ensuite, il trie les valeurs en double par la deuxième colonne, et ainsi de suite.

Par conséquent, l'ordre des colonnes est très important lorsque vous créez un index multicolonne.

Pour utiliser un index multicolonne, la requête doit contenir la condition qui a le même ordre de colonne que celui défini dans l'index.

L'instruction suivante crée un index multicolonne sur le first_name et last_name colonnes des contacts tableau :

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

Essayez-le

Si vous interrogez les contacts table avec l'une des conditions suivantes dans WHERE clause, SQLite utilisera l'index multicolonne pour rechercher des données.

1) filtrer les données par le first_name colonne.

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

2) filtrer les données à la fois par first_name et last_name colonnes :

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

Cependant, SQLite n'utilisera pas l'index multicolonne si vous utilisez l'une des conditions suivantes.

1)filtrer par le last_name colonne uniquement.

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

2) filtrer par first_name OU last_name colonnes.

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

SQLite Afficher les index

Pour trouver tous les index associés à une table, vous utilisez la commande suivante :

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

Par exemple, cette instruction affiche tous les index des contacts tableau :

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

Voici le résultat :

Pour obtenir les informations sur les colonnes d'un index, vous utilisez la commande suivante :

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

Cet exemple renvoie la liste des colonnes de l'index idx_contacts_name :

Une autre façon d'obtenir tous les index d'une base de données consiste à interroger à partir du sqlite_master tableau :

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

SQLite DROP INDEX déclaration

Pour supprimer un index d'une base de données, vous utilisez le DROP INDEX déclaration comme suit :

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

Dans cette syntaxe, vous spécifiez le nom de l'index que vous souhaitez supprimer après le DROP INDEX mots clés. Le IF EXISTS L'option supprime un index uniquement s'il existe.

Par exemple, vous utilisez l'instruction suivante pour supprimer le idx_contacts_name indice :

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

Essayez-le

Le idx_contacts_name index est complètement supprimé de la base de données.

Dans ce didacticiel, vous avez découvert l'index SQLite et comment utiliser les index pour améliorer les performances des requêtes ou appliquer des contraintes uniques.