web-dev-qa-db-fra.com

Différences entre INDEX, PRIMARY, UNIQUE et FULLTEXT dans MySQL?

Quelles sont les différences entre PRIMARY, UNIQUE, INDEX et FULLTEXT lors de la création de tables MySQL?

Comment pourrais-je les utiliser?

577
Sam

Différences

  • KEY ou INDEX fait référence à un index non unique normal. Les valeurs non distinctes de l'index sont autorisées. Par conséquent, l'index peut contenir des lignes avec des valeurs identiques dans toutes les colonnes de l'index. Ces index n'imposent aucune contrainte sur vos données, ils sont donc utilisés uniquement pour s'assurer que certaines requêtes peuvent s'exécuter rapidement.

  • UNIQUE fait référence à un index dans lequel toutes les lignes de l'index doivent être uniques. C'est-à-dire qu'une même ligne peut ne pas avoir des valeurs non NULL identiques pour toutes les colonnes de cet index comme une autre ligne. En plus d’être utilisés pour accélérer les requêtes, les index UNIQUE peuvent également être utilisés pour imposer des restrictions aux données, car le système de base de données ne permet pas de briser cette règle de valeurs distinctes lors de l’insertion ou de la mise à jour de données.

    Votre système de base de données peut autoriser l’application d’un index UNIQUE aux colonnes autorisant les valeurs NULL. Dans ce cas, deux lignes peuvent être identiques si elles contiennent toutes deux une valeur NULL (la raison en est que NULL est considéré différent de lui-même). En fonction de votre application, cependant, vous pouvez trouver cela indésirable: si vous souhaitez éviter cela, vous devez interdire les valeurs NULL dans les colonnes correspondantes.

  • PRIMARY agit exactement comme un index UNIQUE, à la différence qu'il s'appelle toujours 'PRIMARY' et qu'il peut ne en exister qu'un seul sur une table (et là devrait soyez toujours un, même si certains systèmes de bases de données ne l’imposent pas). Un index PRIMARY est conçu comme un moyen principal d'identifier de manière unique une ligne de la table. Par conséquent, contrairement à UNIQUE, il ne doit pas être utilisé sur les colonnes autorisant des valeurs NULL. Votre index PRIMARY doit se trouver sur le plus petit nombre de colonnes suffisant pour identifier une ligne de manière unique. Souvent, il ne s'agit que d'une colonne contenant un numéro unique auto-incrémenté, mais vous pouvez utiliser cette option si vous pouvez identifier une ligne de manière unique, telle que "code pays" dans une liste de pays.

    Certains systèmes de base de données (tels que InnoDB de MySQL) stockent les enregistrements d'une table sur le disque dans l'ordre dans lequel ils apparaissent dans l'index PRIMARY.

  • Les index FULLTEXT sont différents de tous les précédents et leur comportement diffère considérablement entre les systèmes de base de données. Les index FULLTEXT ne sont utiles que pour les recherches en texte intégral effectuées avec la clause MATCH ()/AGAINST (), à la différence des trois précédentes, qui sont généralement implémentées en interne à l'aide d'arborescences b (permettant la sélection, le tri ou les plages à partir de la colonne la plus à gauche) ou tables de hachage (permettant la sélection à partir de la colonne la plus à gauche).

    Là où les autres types d'index sont d'usage général, un index FULLTEXT est spécialisé, en ce sens qu'il a un but restreint: il n'est utilisé que pour une fonctionnalité de "recherche en texte intégral".

Similitudes

  • Tous ces index peuvent contenir plus d'une colonne.

  • À l'exception de FULLTEXT, l'ordre des colonnes est important: pour que l'index soit utile dans une requête, celle-ci doit utiliser les colonnes de l'index en partant de la gauche; elle ne peut pas utiliser uniquement la deuxième, troisième ou quatrième partie d'un élément. index, sauf s'il utilise également les colonnes précédentes de l'index pour faire correspondre les valeurs statiques. (Pour qu'un index FULLTEXT soit utile à une requête, celle-ci doit utiliser toutes les colonnes de l'index.)

638
thomasrutter

Tous ces types sont des types d'indices.

primaire: doit être unique, est un index, est (probablement) l'index physique, ne peut être qu'un par table.

nique: comme il est dit. Vous ne pouvez pas avoir plus d'une ligne avec un tuple de cette valeur. Notez qu'une clé unique pouvant se trouver dans plusieurs colonnes, cela ne signifie pas nécessairement que chaque colonne de l'index est unique, mais que chaque combinaison de valeurs de ces colonnes est unique.

index: Si ce n'est pas primaire ou unique, cela ne contraint pas les valeurs insérées dans la table, mais cela leur permet d'être consultées plus efficacement.

fulltext: une forme d'indexation plus spécialisée qui permet la recherche en texte intégral. Pensez-y comme créant (essentiellement) un "index" pour chaque "mot" dans la colonne spécifiée.

145
tpdi

J'ai l'impression que cela a été bien couvert, peut-être à l'exception de ce qui suit:

  • Simple KEY/INDEX (ou autrement appelé SECONDARY INDEX) augmente les performances si la sélectivité est suffisante. À cet égard, il est généralement recommandé que, si le nombre d'enregistrements dans l'ensemble de résultats sur lequel un index est appliqué dépasse 20% du nombre total d'enregistrements de la table parent, l'index sera inefficace. En pratique, chaque architecture sera différente, mais l'idée est toujours correcte.

  • Les index secondaires (qui sont très spécifiques à mysql) ne doivent pas être considérés comme des objets complètement séparés et différents de la clé primaire. En fait, les deux devraient être utilisés conjointement et, une fois ces informations connues, fournir un outil supplémentaire au DBA mysql: dans Mysql, les index incorporent la clé primaire. Cela conduit à des améliorations significatives des performances, en particulier lors de la construction intelligente d’indices de couverture implicites tels que décrit ici

  • Si vous estimez que vos données doivent être UNIQUE, utilisez un index unique. Vous pensez peut-être que c'est optionnel (par exemple, au niveau de l'application) et qu'un index normal suffira, mais cela représente en réalité une garantie pour Mysql que chaque ligne est unique, ce qui, accessoirement, offre un avantage de performance.

  • Vous ne pouvez utiliser que FULLTEXT (ou autrement appelé SEARCH INDEX) avec Innodb (Dans MySQL 5.6.4 et versions ultérieures) et les moteurs Myisam.

  • Vous ne pouvez utiliser que FULLTEXT sur CHAR, VARCHAR et TEXT types de colonne
  • FULLTEXT index implique BEAUCOUP plus que la simple création d'un index. Un ensemble de tables système ont été créées, un système de mise en cache complètement séparé et des règles et optimisations spécifiques appliquées. Voir http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html et http://dev.mysql.com/doc/refman/ 5.7/fr/innodb-fulltext-index.html
16
Sebas