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.
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
@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 –