2010-07-31 5 views
3

Quelle est la meilleure façon de créer un index SQL dans une base de données SQL?Le meilleur moyen de créer des index SQL?

CREATE INDEX idx ON sometable (col1, col2, col3); 

Ou

CREATE INDEX idx1 ON sometable (col1); 
CREATE INDEX idx2 ON sometable (col2); 
CREATE INDEX idx3 ON sometable (col3); 

Quelle est la différence entre ces 2 méthodes? Cela dépend-il de l'implémentation SQL? (SQLite, MySQL, MSSQL, ...)? Existe-t-il des considérations d'efficacité lors de l'utilisation de l'une des deux méthodes?

Répondre

7
CREATE INDEX idx ON sometable (col1, col2, col3); 

Cela va créer un index unique sur les trois champs ensemble . C'est parfait, si vos requêtes utiliseront les trois champs pour leur clause WHERE la plupart du temps:

SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 AND col3 = 3 

Cet indice composite sera également utilisé lorsque vous interrogez sur col1 et col2 seul:

SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 

mais il ne peut pas être utilisé si vous interrogez sur soit col2 ou col3 séparément, ou sur col2 et col3 ensemble:

SELECT (fields) FROM Table WHERE col2 = 2 AND col3 = 3 -- will *NOT* use index 
SELECT (fields) FROM Table WHERE col2 = 2    -- will *NOT* use index 
SELECT (fields) FROM Table WHERE col3 = 3    -- will *NOT* use index 

D'autre part, si vous utilisez:

CREATE INDEX idx1 ON sometable (col1); 
CREATE INDEX idx2 ON sometable (col2); 
CREATE INDEX idx3 ON sometable (col3); 

alors vous créez trois indices distincts, individuels sur chacun des champs. Dans ce cas, toute requête qui utilise seulement l'une des colonnes bénéficiera de l'index de cette colonne:

SELECT (fields) FROM Table WHERE col1 = 1 -- will use index on col1 
SELECT (fields) FROM Table WHERE col2 = 2 -- will use index on col2 
SELECT (fields) FROM Table WHERE col3 = 3 -- will use index on col3 

cependant, si vous interrogez par deux ou trois colonnes ensemble dans une seule requête:

SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 AND col3 = 3 

alors seulement un des trois indices créés sera utilisé, et il sera probablement moins efficace qu'un index composite sur (col1, col2, col3) serait. Donc oui, il y a certainement une différence dans la façon dont vous créez ces indices, mais il n'y a pas de «meilleure façon» de faire cette indexation. Tout dépend de la manière dont vous interrogez vos données pour savoir laquelle des deux options est la meilleure dans votre cas.

+0

Est-ce que cette chose est valable pour toutes les bases de données sql (sqlite, mysql, ..)? Souhaitez-vous fournir des références pour d'autres lectures sur ce problème? – banx

+0

@banx: aussi longtemps qu'un SGBDR supporte les indices composites, je pense qu'ils fonctionnent tous de la même manière, oui. Je suis très versé dans SQL Server, donc je n'ai pas vraiment de liens pour d'autres systèmes - mais je suis sûr que M. Google ou Mme Bing seront heureux de vous aider - recherchez "index composite" et votre favori RDBMS –

0

Le premier crée un index composite sur 3 colonnes, tandis que le second crée un index simple sur chaque colonne. Consultez l'explication et les exemples dans le MSDN article.

(voir les exemples section d'abord, puis aller lire les définitions de chaque type d'index, sinon je sens l'article est trop intimidant)

Questions connexes