UNIQUE et PRIMARY KEY sont des contraintes , pas les index. Bien que la plupart des bases de données implémentent ces contraintes en utilisant un index. La surcharge supplémentaire de la contrainte en plus de l'index est insignifiante, en particulier lorsque vous comptez le coût de la recherche et de la correction des doublons involontaires quand (et non si) ils se produisent.
Les index sont généralement plus efficaces si vous avez une sélectivité élevée . Il s'agit du rapport entre le nombre de valeurs distinctes et le nombre total de lignes.
Par exemple, dans une colonne pour le numéro de sécurité sociale, vous pouvez avoir 1 million de lignes avec 1 million de valeurs distinctes. La sélectivité est donc de 1000000/1000000 =1,0 (bien qu'il existe de rares exceptions historiques, les SSN sont censés être uniques).
Mais une autre colonne de ce tableau, "gender", ne peut avoir que deux valeurs distinctes sur 1 million de lignes. 2/1000000 =très faible sélectivité.
Un index avec une contrainte UNIQUE ou PRIMARY KEY est garanti d'avoir une sélectivité de 1.0, il sera donc toujours aussi efficace qu'un index peut l'être.
Vous avez posé une question sur la différence entre une clé primaire et une contrainte unique. Principalement, c'est que vous ne pouvez avoir qu'une seule contrainte de clé primaire par table (même si la définition de cette contrainte inclut plusieurs colonnes), alors que vous pouvez avoir plusieurs contraintes uniques. Une colonne avec une contrainte unique peut autoriser les valeurs NULL, tandis que les colonnes dans les contraintes de clé primaire ne doivent pas autoriser les valeurs NULL. Sinon, clé primaire et unique sont très similaires dans leur implémentation et leur utilisation.
Vous avez demandé dans un commentaire s'il fallait utiliser MyISAM ou InnoDB. Dans MySQL, ils utilisent le terme moteur de stockage . Il existe de nombreuses différences subtiles entre ces deux moteurs de stockage, mais les principales sont :
- InnoDB prend en charge les transactions, vous pouvez donc choisir d'annuler ou de valider les modifications. MyISAM est effectivement toujours autocommit.
- InnoDB applique des contraintes de clé étrangère. MyISAM n'applique ni ne stocke même les contraintes de clé étrangère.
Si ces fonctionnalités sont des éléments dont vous avez besoin dans votre application, vous devez utiliser InnoDB.
Pour répondre à votre commentaire, ce n'est pas si simple. InnoDB est en fait plus rapide que MyISAM dans de nombreux cas, cela dépend donc de la combinaison de sélections, de mises à jour, de requêtes simultanées, d'index, de configuration de tampon, etc.
Voir http:/ /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ pour une comparaison très approfondie des performances des moteurs de stockage. InnoDB l'emporte assez souvent sur MyISAM pour qu'il soit clairement impossible de dire que l'un est plus rapide que l'autre.
Comme pour la plupart des questions liées aux performances, la seule façon d'y répondre pour votre application consiste à tester les deux configurations à l'aide de votre application et d'un échantillon représentatif de données, et à mesurer les résultats.