J'ai une table où je stocke les commentaires pour les utilisateurs utilisateurs. J'aurai 100 millions + de commentaires.Table de base de données PK
2 façons je peux créer:
Option 1: nom d'utilisateur et l'identifiant de commentaire comme PK. De cette façon, tous les commentaires sont stockés physiquement par nom d'utilisateur et identifiant de commentaire. Avantages: Ma requête obtiendra tous les 10 meilleurs commentaires pour une commande d'utilisateur par comment_id DESC. Ceci est SEEK
Option 2: Je peux faire l'id de commentaire comme PK. Cela va stocker les commentaires triés par l'identifiant du commentaire, pas par le nom d'utilisateur. Inconvénients: Obtenir les derniers commentaires du top 10 d'un utilisateur donné n'est plus une recherche, car les données ne sont pas stockées par l'utilisateur (c'est-à-dire non triées par l'utilisateur). Je dois donc créer un autre index pour améliorer les performances de la requête.
Quelle est la meilleure façon de procéder? Qu'en est-il de l'insertion et de la suppression? Ces opérations sont autorisées. Mais lire est fréquent.
L'utilisateur ne peut pas modifier ses commentaires.
J'ai testé les deux tables avec des rangées de 1,1M. Voici le résultat:
table_name rows reserved data index_size unused
comments2 1079892 99488 KB 62824 KB 36576 KB 88 KB (PK: com_id Second Index on (user_name, com_id))
comments1 1079892 82376 KB 82040 KB 328 KB 8 KB (PK: user_name, no other indices)
--------------------------------------------------------------------
diff: same rows 17112KB -19216KB 36,248KB 80KB
Ainsi, la table avec com_id comme PK utilise 36 Mo d'espace disque supplémentaire juste pour l'index 2 La sélection de requête principale à la fois table à l'aide SEEK, mais table avec com_id PK est plus lent Mais l'insertion est légèrement plus rapide quand j'ai com_id comme PK
Un commentaire?
Pour la table comments2, essayez PK = com_id desc, Index = nom_utilisateur asc (n'incluez pas com_id dans l'index non-PK). – ulty4life