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.