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

Table MySQL avec index composite mais pas de clé primaire

Quelques points :

Il semble que vous utilisiez simplement ce qui est actuellement unique dans la table et que vous en fassiez une clé primaire. Ça marche. Et les clés naturelles présentent certains avantages lorsqu'il s'agit d'interroger en raison de la localité. (Les données de chaque utilisateur sont stockées dans la même zone). Et parce que la table est regroupée par cette clé qui élimine les recherches dans les données si vous effectuez une recherche par les colonnes dans le primaire.

  1. Cependant, l'utilisation d'une clé primaire naturelle comme celle que vous avez choisie présente également des inconvénients en termes de performances.

  2. L'utilisation d'une très grande clé primaire rendra tous les autres index très volumineux dans innodb car la clé primaire est incluse dans chaque valeur d'index.

  3. L'utilisation d'une clé primaire naturelle n'est pas aussi rapide qu'une clé de substitution pour les INSERT car en plus d'être plus grande, elle ne peut pas simplement s'insérer à la fin de la table à chaque fois. Il doit être inséré dans la section de cet utilisateur et de cet article, etc.

  4. De plus, si vous effectuez une recherche par heure, vous chercherez probablement partout dans le tableau avec une clé naturelle, à moins que l'heure ne soit votre première colonne. les clés de substitution ont tendance à être locales dans le temps et peuvent souvent convenir à certaines requêtes.

  5. L'utilisation d'une clé naturelle comme la vôtre comme clé primaire peut également être ennuyeuse. Que faire si vous souhaitez faire référence à un vote en particulier ? Vous avez besoin de quelques champs. C'est aussi un peu difficile à utiliser avec beaucoup d'ORM.

Voici la réponse

Je créerais votre propre clé de substitution et l'utiliserais comme clé primaire plutôt que de compter sur la clé primaire interne d'innodb, car vous pourrez l'utiliser pour les mises à jour et les recherches.

ALTER TABLE tbl_rate 
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
ADD PRIMARY KEY(id);

Mais, si vous créez une clé primaire de substitution, je ferais également de votre clé une UNIQUE. Même coût mais cela impose l'exactitude.

ALTER TABLE tbl_rate 
ADD UNIQUE ( user_id, post_id, type );