Optimisation des index PostgreSQL

PostgreSQLBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à optimiser les performances des bases de données PostgreSQL grâce à l'indexation. Vous commencerez par créer une table users d'exemple et la peupler de données. Ensuite, vous créerez un index sur une seule colonne, analyserez les plans de requête à l'aide de EXPLAIN, construirez un index multicolonne, et enfin, vous apprendrez comment supprimer un index inutilisé pour maintenir l'efficacité de la base de données. Cette expérience pratique vous apportera des compétences pratiques en gestion des index PostgreSQL.

Créer un index à colonne unique

Dans cette étape, vous allez créer une table d'exemple nommée users, puis créer un index sur une seule colonne, la colonne email. Les index sont cruciaux pour améliorer les performances des requêtes de base de données, surtout lorsqu'il s'agit de grandes tables.

Connectez-vous d'abord à la base de données PostgreSQL en tant qu'utilisateur postgres :

sudo -u postgres psql

Maintenant, créez la table users. Exécutez la commande SQL suivante :

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at TIMESTAMP
);

Cette commande crée une table nommée users avec des colonnes pour id, username, email et created_at. La colonne id est la clé primaire et s'incrémente automatiquement.

Ensuite, insérez des données d'exemple dans la table users. Exécutez les commandes SQL suivantes :

INSERT INTO users (username, email, created_at) VALUES
('john_doe', 'john.doe@example.com', NOW()),
('jane_smith', 'jane.smith@example.com', NOW()),
('peter_jones', 'peter.jones@example.com', NOW()),
('mary_brown', 'mary.brown@example.com', NOW()),
('alice_wilson', 'alice.wilson@example.com', NOW()),
('bob_davis', 'bob.davis@example.com', NOW()),
('carol_garcia', 'carol.garcia@example.com', NOW()),
('david_martinez', 'david.martinez@example.com', NOW()),
('emma_anderson', 'emma.anderson@example.com', NOW()),
('frank_taylor', 'frank.taylor@example.com', NOW());

-- Insert additional rows to make the table large enough for index usage
INSERT INTO users (username, email, created_at)
SELECT
    'user_' || generate_series(1, 1000),
    'user' || generate_series(1, 1000) || '@example.com',
    NOW();

Vous avez maintenant inséré plus de 1000 lignes de données dans la table users. Cet ensemble de données plus important aidera à démontrer plus efficacement l'utilisation des index, car PostgreSQL utilise généralement les index lorsqu'ils offrent un avantage de performance par rapport à l'analyse de la table entière.

Pour accélérer les requêtes basées sur la colonne email, créez un index sur la colonne email. Exécutez la commande SQL suivante :

CREATE INDEX idx_users_email ON users (email);

Cette commande crée un index nommé idx_users_email sur la colonne email de la table users.

Pour vérifier que l'index a été créé, vous pouvez utiliser la commande \di dans psql. Exécutez la commande suivante :

\di

Vous devriez voir l'index idx_users_email listé dans la sortie.

Enfin, quittez le shell psql en tapant :

\q

Utiliser EXPLAIN pour analyser les plans de requêtes

Dans cette étape, vous apprendrez à utiliser la commande EXPLAIN dans PostgreSQL pour analyser les plans de requête. Comprendre les plans de requête est essentiel pour optimiser les requêtes de base de données et garantir des performances efficaces.

Connectez-vous d'abord à la base de données PostgreSQL en tant qu'utilisateur postgres :

sudo -u postgres psql

Maintenant, utilisons la commande EXPLAIN pour analyser une requête simple. Exécutez la commande suivante :

EXPLAIN SELECT * FROM users WHERE email = 'jane.smith@example.com';

Cette commande affichera le plan de requête pour l'instruction SELECT. Avec notre jeu de données plus important, vous devriez voir un "Index Scan" ou un "Bitmap Index Scan" dans la sortie, indiquant que PostgreSQL utilise l'index idx_users_email pour localiser efficacement la ligne avec l'adresse e-mail spécifiée.

Pour obtenir des informations plus détaillées, y compris le coût, vous pouvez utiliser EXPLAIN ANALYZE. Cependant, pour cet exemple de base, EXPLAIN est suffisant.

Analysons maintenant une requête qui n'utilise pas l'index email. Exécutez la commande suivante :

EXPLAIN SELECT * FROM users WHERE username LIKE 'user_%';

La sortie affichera un "Seq Scan" (Sequential Scan) sur la table users, ce qui signifie que PostgreSQL parcourt toute la table pour trouver les lignes correspondantes. Cela se produit parce que :

  1. Nous n'avons pas d'index sur la colonne username.
  2. L'opérateur LIKE avec un joker à la fin peut bénéficier d'un index, mais sans celui-ci, PostgreSQL doit parcourir toutes les lignes.

Cela démontre l'importance de créer des index sur les colonnes fréquemment utilisées dans les clauses WHERE.

En analysant les plans de requête avec EXPLAIN, vous pouvez identifier les goulots d'étranglement potentiels en matière de performances et déterminer si vos index sont utilisés efficacement.

Enfin, quittez le shell psql en tapant :

\q

Créer un index multi-colonnes

Dans cette étape, vous apprendrez à créer un index multi-colonnes dans PostgreSQL. Un index multi-colonnes est un index qui comprend deux colonnes ou plus. Il peut améliorer considérablement les performances des requêtes lorsque celles-ci filtrent ou trient sur plusieurs colonnes simultanément.

Connectez-vous d'abord à la base de données PostgreSQL en tant qu'utilisateur postgres :

sudo -u postgres psql

Supposons que vous interrogez fréquemment la table users en vous basant à la fois sur les colonnes username et email. Pour optimiser ces requêtes, vous pouvez créer un index multi-colonnes sur ces deux colonnes. Exécutez la commande SQL suivante :

CREATE INDEX idx_users_username_email ON users (username, email);

Cette commande crée un index nommé idx_users_username_email sur les colonnes username et email de la table users. L'ordre des colonnes dans la définition de l'index est important. L'index est le plus efficace lorsque la requête filtre sur les colonnes dans le même ordre qu'elles apparaissent dans l'index.

Pour vérifier que l'index a été créé, vous pouvez utiliser la commande \di dans psql. Exécutez la commande suivante :

\di

Vous devriez voir l'index idx_users_username_email listé dans la sortie.

Analysons maintenant une requête qui peut bénéficier de cet index multi-colonnes. Exécutez la commande suivante :

EXPLAIN SELECT * FROM users WHERE username = 'user_1' AND email = 'user1@example.com';

La sortie devrait indiquer que PostgreSQL utilise l'index idx_users_username_email pour exécuter la requête efficacement. Vous devriez voir "Index Scan" ou "Bitmap Index Scan" dans le plan de requête, indiquant que l'index multi-colonnes est utilisé.

Enfin, quittez le shell psql en tapant :

\q

Supprimer un index inutilisé

Dans cette étape, vous apprendrez à supprimer un index inutilisé dans PostgreSQL. Les index améliorent les performances des requêtes, mais ils consomment également de l'espace de stockage et peuvent ralentir les opérations d'écriture (insertions, mises à jour et suppressions). Par conséquent, il est important d'identifier et de supprimer les index qui ne sont plus utilisés.

Connectez-vous d'abord à la base de données PostgreSQL en tant qu'utilisateur postgres :

sudo -u postgres psql

Supposons qu'après avoir analysé vos modèles de requêtes, vous déterminiez que l'index idx_users_email est rarement utilisé. Pour supprimer cet index, exécutez la commande SQL suivante :

DROP INDEX idx_users_email;

Cette commande supprime l'index nommé idx_users_email de la base de données.

Pour vérifier que l'index a été supprimé, vous pouvez utiliser la commande \di dans psql. Exécutez la commande suivante :

\di

Vous ne devriez plus voir l'index idx_users_email listé dans la sortie.

Avant de supprimer un index, il est crucial de s'assurer qu'il est réellement inutilisé. Vous pouvez utiliser le collecteur de statistiques de PostgreSQL pour recueillir des informations sur l'utilisation des index. Cependant, l'activation et l'analyse de ces statistiques dépassent le cadre de ce laboratoire. Dans un scénario réel, vous surveilleriez l'utilisation des index sur une période donnée avant de décider de supprimer un index.

Remarque : Le planificateur de requêtes de PostgreSQL est intelligent et n'utilisera les index que lorsqu'ils apporteront un avantage en termes de performances. Pour les très petites tables (généralement moins de quelques centaines de lignes), PostgreSQL peut choisir des scans séquentiels plutôt que des scans d'index, car la surcharge liée à l'utilisation d'un index l'emporte sur les avantages. C'est pourquoi nous avons ajouté de nombreuses lignes à notre table users - pour démontrer des scénarios d'utilisation d'index réalistes.

La suppression d'un index incorrect peut avoir un impact négatif sur les performances des requêtes. Par conséquent, soyez prudent et analysez minutieusement vos modèles de requêtes avant de supprimer un index.

Enfin, quittez le shell psql en tapant :

\q

Résumé

Dans ce laboratoire, vous avez appris à créer des index à colonne unique et multi-colonnes dans PostgreSQL pour améliorer les performances des requêtes. Vous avez également appris à analyser les plans de requêtes à l'aide de EXPLAIN pour déterminer si vos index sont utilisés efficacement. Les points clés à retenir sont les suivants :

  • Le planificateur de requêtes de PostgreSQL choisit intelligemment s'il faut utiliser les index en fonction de la taille de la table et des caractéristiques de la requête.
  • Les index sont plus bénéfiques pour les grandes tables où le coût de la recherche d'index est inférieur à celui du scan de toutes les lignes.
  • Les index multi-colonnes peuvent améliorer considérablement les performances des requêtes qui filtrent sur plusieurs colonnes.
  • La surveillance régulière et la suppression des index inutilisés permettent de maintenir des performances optimales de la base de données.

Ces compétences sont essentielles pour optimiser les performances des bases de données PostgreSQL dans les applications réelles.