lister Deux index à une seule colonne et un index à deux colonnes dans MySQL?



index sql oracle (4)

Si l'un des index de clé étrangère est déjà très sélectif, le moteur de base de données doit utiliser celui-ci pour la requête que vous avez spécifiée. La plupart des moteurs de bases de données utilisent une sorte d'heuristique pour pouvoir choisir l'index optimal dans cette situation. Si aucun index n'est hautement sélectif, il est probablement judicieux d'ajouter l'index construit sur les deux clés puisque vous dites que vous utiliserez beaucoup ce type de requête.

Une autre chose à considérer est si vous pouvez éliminer le champ PK dans cette table et définir l'index de clé primaire sur les champs giver_id et recipient_id . Vous avez dit que la combinaison est unique, donc cela fonctionnerait probablement (étant donné beaucoup d'autres conditions que vous seul pouvez répondre). En règle générale, cependant, je pense que la complexité ajoutée qui ajoute ne vaut pas la peine.

Je suis confronté à ce qui suit et je ne suis pas sûr de ce qui est la meilleure pratique.

Considérez le tableau suivant (qui deviendra grand):

ID PK | giver_id FK | recipient_id FK | rendez-vous amoureux

J'utilise InnoDB et d'après ce que je comprends, il crée automatiquement des index pour les deux colonnes de clé étrangère. Cependant, je vais aussi faire beaucoup de requêtes où je dois correspondre à une combinaison particulière de:

SELECT...WHERE giver_id = x AND recipient_id = t .

Chaque combinaison de ce type sera unique dans le tableau.

Y a-t-il un avantage à ajouter un index à deux colonnes sur ces colonnes, ou est-ce que les deux index individuels seraient théoriquement suffisants / identiques?


Answer #1

Si vous avez deux index de colonne unique, un seul d'entre eux sera utilisé dans votre exemple.

Si vous avez un index avec deux colonnes, la requête peut être plus rapide (vous devriez mesurer). Un index à deux colonnes peut également être utilisé comme index à une seule colonne, mais uniquement pour la colonne répertoriée en premier.

Parfois, il peut être utile d'avoir un index sur (A, B) et un autre index sur (B). Cela permet d'accélérer les requêtes en utilisant l'une des colonnes ou les deux, mais utilise bien sûr également plus d'espace disque.

Lors du choix des index, vous devez également prendre en compte l'effet sur l'insertion, la suppression et la mise à jour. Plus d'index = mises à jour plus lentes


Answer #2

Un index couvrant comme:

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id);

... signifierait que l'index pourrait être utilisé si une requête faisait référence à giver_id , ou une combinaison de giver_id et recipient_id . Gardez à l'esprit que les critères d'index sont les plus à gauche - une requête faisant uniquement référence à l'attribut recipient_id ne pourrait pas utiliser l'index de couverture dans l'instruction fournie.

De plus, MySQL ne peut utiliser qu'un index par SELECT, donc un index couvrant serait le meilleur moyen d'optimiser vos requêtes.


Answer #3

Une autre chose à considérer est que les caractéristiques de performance des deux approches seront basées sur la taille et la cardinalité de l'ensemble de données. Vous pouvez constater que l'index à 2 colonnes ne devient plus performant qu'à un certain seuil de taille de l'ensemble de données, ou exactement le contraire. Rien ne peut remplacer les mesures de performance pour votre scénario exact.





indexing