Existe-t-il un moyen de déterminer la meilleure façon de savoir quels index créer pour une table?
Règles générales courtes. (Certains d'entre eux sont créés automatiquement, mais peuvent éventuellement être supprimés manuellement plus tard, en fonction de vos dbms. Ne supposez pas que vous travaillerez toujours sur PostgreSQL. )
Chaque clé primaire signifie que les clés primaires multi-colonnes doivent avoir un index unique couvrant toutes les colonnes. PostgreSQL créera cet index automatiquement si vous déclarez une clé primaire à plusieurs colonnes.
Il existe de nombreux cas dans lesquels un index multi-colonne unique vous offre de meilleures performances que plusieurs index mono-colonne. Surveillez les requêtes lentes et faites des tests pour déterminer lequel est lequel.
Supposons que toute modification de l'indexation améliorera certaines activités de base de données et en dégradera d'autres. Je trouve utile d'avoir un ensemble d'instructions SQL que je peux profiler avant et après avoir apporté des modifications aux index. Cet ensemble comprend les instructions SELECT, INSERT, UPDATE et DELETE.
Il n'y a pas de substitut à l'étude des documents pour vos dbms particuliers.
En plus de ce que @ Catcall déjà fourni , et pour ajouter un petit correctif:
J'ai également couvert quelques notions de base dans cette réponse étroitement liée sur SO récemment .
Jusqu'à présent, les réponses semblent indiquer que vous devez créer des index sur les clés primaires, mais ce n'est pas le cas dans PostgreSQL (des exceptions partielles s'appliquent). Je cite le manuel ici :
PostgreSQL crée automatiquement un index unique lorsqu'une contrainte ou une clé primaire unique est définie pour une table. L'index couvre les colonnes qui constituent la clé primaire ou la contrainte unique (un index multicolonne, le cas échéant), et est le mécanisme qui applique la contrainte.
Accentuation sur moi.
Vous peut-être voulez créer des index supplémentaires pour la deuxième ou les colonnes ultérieures d'un index multi-colonnes, mais la première est généralement très bien couverte par une multicolonne index - sauf lorsque des colonnes supplémentaires rendent l'index beaucoup plus grand. Nous en avons discuté en détail sous cette question connexe:
n index composite est-il également bon pour les requêtes sur le premier champ?
Index multicolonnes , index partiels et index sur les expressions sont des outils particulièrement puissants dans PostgreSQL. Depuis PostgreSQL 9.2, il existe également analyses uniquement indexées , l'équivalent de "couvrir les index" dans d'autres SGBDR. Ce n'est pas un autre type d'index, mais une nouvelle capacité du SGBDR avec les types d'index existants.
Chaque index entraîne des coûts spécifiques , il n'y a donc aucun moyen de contourner certaines connaissances de base pour vraiment optimiser l'indexation. Créer simplement plus d'index peut faire plus de mal que de bien. En particulier, les index peuvent empêcher les mises à jour CHAUDES d'améliorer les performances.
Généralement, les opérations d'écriture (DELETE
, UPDATE
) deviennent plus coûteuses (mais peuvent également en bénéficier!), Tandis que les opérations de lecture (SELECT
) en bénéficient généralement. Trop d'index peuvent épuiser la mémoire cache de sorte que même les opérations de lecture peuvent souffrent.
Enfin, cette page Wiki de Postgres sur la maintenance des index propose des outils pour trouver des index en double ou inutilisés (entre autres).
Il y a deux options.
La réponse pour le faire vous-même est documentée de manière assez exhaustive ici. Alors regardons autre chose.
Pghero peut être en mesure de vous aider si vous souhaitez des conseils automatisés.
Cela dit, il présente certaines lacunes.
WHERE
et ORDER BY
, non JOINS
.Découvrez cette vidéo pour plus d'informations .