2011-08-22 1 views
3

J'ai ces trois colonnes ici sur une table: année, pid (entier), et le code (varchar). Voulez-vous indexer chacun d'eux? Quel est le meilleur (j'utilise postgres, mais je suis curieux au sujet des systèmes en général): aller tous CREATE INDEX myidx ON mytable USING btree (year, pid, code); ou aller btree index individuel sur chaque trois colonnes?Un peu de côté sur les index et postgres

Quelles sont les implications de ces deux approches?

+5

Cela dépend de la façon dont vous les interrogez - toutes les colonnes à la fois, un sous-ensemble, individuellement seulement - et si les valeurs de chacun sont uniques ou répétées. – Rup

+0

Je suis d'accord avec Rup. Les indices doivent toujours être construits en fonction des cas d'utilisation prévus. –

Répondre

2

La différence entre eux est la suivante. Supposons que vous ayez les colonnes A, B, C et que vous y insériez un index complexe dans exactement cet ordre. maintenant, quand vous faites

SELECT * from table where A = .. AND B = .. AND C = 

alors l'index sera utilisé et c'est l'utilisation la plus efficace de cet index.

si vous avez requête

SELECT * from table where A = .. 

alors l'index sera toujours utilisé. Cependant, la idnex ne sera pas (mis à jour grâce à des commentaires: ou seulement en partie pour 2 et 3 par exemple) peuvent être utilisés:

SELECT * from table where B .. 
SELECT * from table where A = .. AND C = .. AND B = .. 
SELECT * from table where A = .. AND C = .. 

cependant à nouveau sera utilisé dans:

SELECT * from table where A = .. AND B = .. 

espérons que cette aide. L'ordre est la clé ici. Et bien sûr ce dont vous avez besoin. Si vous avez trois requêtes comme

SELECT * ... where A 
SELECT * ... where B 
SELECT * ... where C 

alors bien sûr faire 3 index sur une seule colonne. Cependant, si vous avez des requêtes avec ET, assurez-vous d'avoir le même ordre et ensuite faites 1 index pour 3 colonnes

+1

Dans votre troisième exemple, l'index sera partiellement utilisé dans la deuxième et la troisième requête – Crack

+0

@Crack oui c'est vrai. Ce n'est pas ce que vous préférez, mais vous avez raison à 100%, il vaut la peine de souligner cela. actualisé – mkk

2

Ne créez pas d'index sur des colonnes aléatoires, créez-les toujours en fonction de la façon dont vous utilisez une table. C'est à dire. Si vous utilisez une requête comme SELECT ... WHERE year = 2011 AND pid = 2, créez un index sur (année, pid). Un index vous permet d'exécuter certaines requêtes plus efficacement, mais il prend également de l'espace disque et rend les insertions plus lentes.

Vous pouvez avoir une idée générale de ce que les index sont bons en lisant 3 ways MySQL uses indexes et Indexes in MySQL (deux courts articles expliquant comment MySQL gère les index). N'oubliez pas que chaque SGBD fonctionnera un peu différemment.

Quel est le meilleur

La seule réponse valable est - elle dépend (de vos scénarios d'utilisation, la quantité de données stockées, la sélectivité de la colonne, ...).

Questions connexes