it-swarm-fr.com

Fait faire un champ unique le rendre indexé?

Si je fais une contrainte unique sur un champ, est-ce que je dois également faire un index sur ce champ afin d'obtenir un temps d'insertion évolutif? Ou est-ce fait pour moi (même si l'indice qu'il utilise n'est pas accessible au public?)

Spécifiquement, je travaille avec Apache Derby pour le prototypage, même si je vais probablement le déplacer vers MySQL dans le futur semi-proche. J'espère aussi qu'il pourrait y avoir quelque chose dans la norme SQL qui dit quelque chose à ce sujet.

Je n'aurai jamais besoin de chercher par ce champ, alors je préférerais ne pas faire un index inutile. Mais je préfère avoir un index inutile que d'avoir une O(n) insérer du temps.

10
corsiKa

Clé primaire> = unique> = Index == clé

Les données InnoDB sont commandées par le PK. Myisam Pk agit la même chose que l'unique.

L'insertion doit ajouter une "ligne" à chaque index (de n'importe quel type) que vous avez. Cela prend un peu de temps. (Généralement pas assez de temps pour la matière.) Les index sont tous stockés au format BTREE. Les blocs de myisam Btree sont de 1kb; InnoDB utilise 16 Ko.

InnoDB met à jour la PK et les données simultanément.

Insertion dans Myisam généralement "ajoute" les données au .MYD. Séparément, il ajoute une rangée au PK (le cas échéant).

L'insertion doit d'abord vérifier qu'il n'y a pas de clé en double pour une clé primaire ou unique. Ceci est fait en utilisant l'index. Et, par conséquent, pourquoi les contraintes de clé unique et étrangère construisent vraiment des index. C'est O (logn), mais généralement de la CPU, pas d'E/S, car si une mise en cache efficace.

2
Rick James

--ÉDITER--

Ma réponse originale (ci-dessous) n'est probablement pas utile pour vous, car elle ne répond pas à la question de unique contraintes. Comme d'autres l'ont dit, ces contraintes sont généralement mises en œuvre avec un indice unique implicite. Dans des cas particuliers, cela pourrait ne pas être vrai (par exemple, disable novalidate Pour Oracle).

La question pourrait être la suivante: est-il possible d'appliquer l'unicité sans index? De manière générale, la réponse est non si, dans certains cas, un Index en cluster signifie que l'index et la table sont le même objet.

--End éditer--

Vous avez dit "Je préférerais avoir un index inutile que d'avoir un temps d'insertion O(n).", Mais dans les bases de données générales n'a pas de O(n) insérer du temps. Il y a deux cas à considérer:

  1. Une table normale avec ou sans index:

    Les nouvelles lignes sont larguées au sommet du tas. Les RDBMS ne cherchent probablement que 1 bloc, donc pas seulement O(1) mais très petit O (1).

    Si la table a des index, un pointeur de la ligne sera ajouté à chacun. Cela sera généralement une opération O(log(n)).

  2. Une table avec une sorte de regroupement en continu, par exemple une index organisée ou cluster pour oracle ou a Index en cluster pour SQL Server et d'autres :

    Les nouvelles lignes sont insérées dans un bloc particulier, ce qui peut provoquer la division ou le débordement du bloc, mais tout ce qui se passe, il reste O(log(n)) ou mieux , causé par le B. -tree ou structure similaire utilisée pour trouver le bloc.

Pour répondre à la question en gras: Oui, faire un champ unique l'indice comme une clé primaire. En fait, j'avais discuté de cela dans une autre question concernant touches primaires ayant son propre nom pour le distinguer d'autres clés uniques (candidates) .

En ce qui concerne les contraintes, les index sont créés pour vous afin que le paradigme de contrainte soit configuré. Vous devriez être capable de supprimer des index en double, même des clés uniques, tant que la contrainte que vous avez faite ne référencent pas d'autres clés uniques que vous avez personnellement diffusées du paradigme de contrainte.

Vous n'aurez peut-être jamais à rechercher ce champ, mais MySQL devra-t-il certainement être à titre de chemin pour déterminer la validité des clés et déterminer comment faire fonctionner sur Suppr Cascade et sur les opérations de mise à jour de la cascade.

L'index unique garantit simplement l'unicité des tuples (singletons, paires, triplés, ..., n-tuples, etc.) dans chaque rangée de la table.

Il est à votre discrétion de supprimer de tels index dupliqués, à condition que vous ne brisez pas le paradigme de contrainte, vous voulez avoir la table.

1
RolandoMySQLDBA