Je concevons une base de données avec plusieurs tables de recherche contenant des attributs possibles des entités principales. Je pense utiliser une touche 4 ou 5 caractères pour identifier ces valeurs de recherche plutôt qu'un entier d'incrémentation automatique de sorte que lorsque je stocke ces identifiants d'attributs sur les tables principales, je vais voir des valeurs significatives plutôt que des nombres aléatoires.
Quelles sont les conséquences de la performance d'utiliser un champ de caractère comme clé primaire plutôt qu'un entier?
J'utilise MySQL si cela importe.
[modifier]
[.____] Ces tables de recherche ont de nouveaux enregistrements ajoutés rarement. Ils sont maintenus manuellement et les clés basées sur les personnages sont également créées manuellement. Voici un exemple:
CUISINES
ID Description
----- --------------
CHNSE Chinese
ITALN Italian
MXICN Mexican
La vraie question est de savoir si la performance de la requête DB est importante pour votre application (taille des données). Si votre requête prend des microsecondes, économiser quelques-unes de ces microsecondes à l'aide de Int
clés ne valent pas la peine de lisibilité/de maintenance. Toutefois, si votre requête prend quelques minutes, sauvegarder certaines de ces minutes peut valoir la douleur des touches Int
.
Vous trouverez ci-dessous la raison pour laquelle je pense que les entiers peuvent vous faire économiser du temps de requête (en pourcentage de votre temps de requête global), mais les fondateurs de Skyspark peuvent l'expliquer mieux que moi . Divulgation complète, mon employeur verse Skyspark beaucoup d'argent pour utiliser leur dB et j'essaie de construire quelque chose de meilleur/plus rapide.
Si vous avez beaucoup de données séquentielles (fichiers journaux, séries chronologiques, analyses, textes ou paroles) qui ont des liens (relations) à l'une de vos tables de recherche, vous constaterez que l'espace de stockage est essentiel à la vitesse de la requête, malgré @ @ L'analyse correcte de Ballsun-Stanton de la manière de l'espace pas cher est en $. Parce que la plupart des temps de requête (pour les données séquentielles) sont utilisés de lire le disque, l'espace n'est pas bon marché en termes de temps (en pourcentage de la durée de la requête globale ). Donc, à moins que votre RDB compresse automatiquement et décompresse efficacement toutes les touches étrangères (touches des enregistrements associés), vous voudrez que toutes vos clés soient Int
, qui sont les plus efficaces en termes d'espace disque (et de lecture Vitesse) par unité de contenu d'information (entropie). Fyi Myisam In MySQL Place les restrictions sur ce que vous pouvez faire avec des lignes de données comprimées (en lecture seule). En d'autres termes, les entiers incrémentés automatiquement sont déjà compressé autant que possible théoriquement possible , étant donné la faible limitation de taille minimale sur la plupart des champs d'entier de DB. Et cette compression vient sans:
Il y a une raison pour laquelle des ormes populaires et efficaces comme Django par défaut d'incrémenter automatiquement les entiers pour PKS et pourquoi d'autres SO QUESTIONS sont arrivés à la même conclusion.