Mysql
 sql >> Base de données >  >> RDS >> Mysql

Indexer une colonne ayant des valeurs en double

Sur la base de la spécification incomplète, je ferais ceci :

   CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)

Cet index satisferait l'exigence d'un index avec storeid comme colonne de tête. (Et nous savons qu'il y aura cette exigence s'il s'agit d'InnoDB et de storeid est une clé étrangère.)

Avec une ligne de table aussi courte, j'irais de l'avant et en ferais un index de couverture, et j'inclurais toutes les colonnes. Ensuite, les requêtes peuvent être satisfaites directement à partir des pages d'index sans rechercher les pages de données dans la table sous-jacente.

Puisque nous savons que (seedid,storeid) est unique (donné comme PRIMARY KEY), nous connaissons (storeid,seedid) est également unique, nous pouvons donc tout aussi bien déclarer l'index UNIQUE.

Il existe d'autres choix; nous n'avons pas à créer cet index ci-dessus. Nous pourrions simplement faire ceci à la place :

   CREATE INDEX stock_IX2 ON stock (storeid)

Mais cela utilisera presque la même quantité d'espace et ne sera pas aussi bénéfique pour autant de requêtes possibles.

L'index secondaire contiendra la clé primaire de la table; de sorte que le deuxième index inclura le seedid colonne, étant donné la PRIMARY KEY de la table. C'est-à-dire que l'index est équivalent à ceci :

   CREATE INDEX stock_IX3 ON stock (storeid,seedid)

Et nous savons que la combinaison de ces deux colonnes est unique, nous pouvons donc inclure le mot-clé UNIQUE

   CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)

Si on fait un EXPLAIN sur une requête de la forme

  EXPLAIN
  SELECT t.storeid
       , t.seedid
       , t.stk 
    FROM stock t 
   WHERE t.storeid = 'foo'

nous sommes susceptibles de voir une opération de balayage de plage sur l'index secondaire ; mais en récupérant la valeur de stk nécessitera une recherche dans les pages de données de la table sous-jacente. Y compris le stk colonne dans l'index secondaire fera de l'index une couverture index pour la requête. Avec l'index recommandé en premier dans la réponse, nous attendons le EXPLAIN sortie pour afficher "Utilisation de l'index".