2009-12-04 9 views
1

Cette question concerne la performance, pas de solutions possibles.MySQL: scinder une table en plusieurs tables (mêmes colonnes) pour augmenter la performance?

Mon système contient plusieurs éléments de différentes catégories. Chaque catégorie a sa propre table car chaque table a plusieurs lignes ET les champs sont différents.

ItemA - id, fld1, fld2 
ItemB - id, fld1, fld3, fld4 
ItemC - id, fld1, fld3, fld5 
.... 

Maintenant, il est nécessaire de gérer l'inventaire de l'utilisateur, ce qui signifie que l'utilisateur a un élément ou non. Une option utilise une seule table:

Inventory - category_id, item_id, user_id 

category_id est différent pour Itema, elementB, ... lignes et voilà comment nous différencions.

Deuxième option est d'avoir:

InventoryA - item_id, user_id 
InventoryB - item_id, user_id 
... 

La première option est probablement le plus facile à gérer, mais la table d'inventaire est énorme (ordre de grandeur: nombre d'articles sur toutes les catégories multiplié par le nombre d'utilisateurs) et souvent mis à jour et fréquemment interrogé.

La deuxième option serait un peu plus difficile à gérer (car nous créons une nouvelle table d'inventaire pour chaque catégorie) mais pourrait introduire un gain de performance car cela pourrait empêcher les conditions de course. Aucune requête ne nécessitera probablement d'impliquer plus d'un des tableaux d'inventaire car les catégories sont assez séparées.

Actuellement, le système utilise le moteur MySQL et InnoDB. Il y a ~ 10 catégories mais devrait atteindre quelques dizaines dans un proche avenir. La plus grande catégorie a> 200k articles et la plupart ont> 10k articles. La table d'inventaire unique a plus de 10M lignes et devrait être BEAUCOUP plus grande à mesure que de nouveaux utilisateurs se joindront.

Je sais que le mieux est de tester la performance des deux méthodes et de décider, mais la vérité est qu'il ne sera pas si rapide et indolore de passer à la conception de plusieurs tables.

Si vous avez expérience personnelle avec un problème similaire, veuillez le partager.

Merci

+0

Peut-on appartenir article (utilisé) par de nombreux utilisateurs? –

+0

Oui Damir, c'est une relation plusieurs-à-plusieurs. – Colnector

Répondre

4

la base de données est la normalisation normalement mieux pour la performance et maintenabilité.

Cette approche crée une table Items qui a une relation 1: 1 avec ItemA, ItemB, etc. Vous pouvez ensuite créer une table Inventory qui a une relation avec la table Items de base. Selon le documentation, InnoDB prend en charge les verrous de niveau ligne, il n'est donc pas nécessaire d'utiliser plusieurs tables pour éviter les interblocages.

+0

Merci Andomar pour votre réponse. À mon humble avis, cependant, ce que vous suggérez serait en fait une très mauvaise idée qui diminuerait davantage la performance. Actuellement, la première solution que j'ai présentée est implémentée. Chaque requête de la base de données concerne uniquement l'une des catégories et je ne peux vraiment pas comprendre comment l'ajout d'une table Items supplémentaire améliorerait les performances. La normalisation est un bon concept, mais la question ici concerne les implications pratiques en termes de performances. Oui, InnoDB prend en charge les verrous au niveau de la ligne, mais ce ne sont pas des blocages dont j'ai peur, mais plutôt la diminution des performances. – Colnector

+0

@Colnector: Ajouter une table de base vous permet d'avoir une relation de clé étrangère entre 'inventory' et' item' – Andomar

+0

Oui @Andomar, je comprends cela mais je ne vois vraiment pas comment cela m'aide avec ce que je demande à propos de . Actuellement, j'ai l'inventaire (category_id, item_id, user_id) et avec votre suggestion je vais avoir l'inventaire (item_id, user_id) MAIS je vais devoir JOIN sur la nouvelle table d'article pour CHAQUE ET CHAQUE requête. Cela va diminuer les performances. – Colnector

1

Voici mon point de vue sur cette histoire, espérons que cela aide un peu.

  • La table d'éléments comporte des champs communs à tous les éléments.
  • Les tableaux de catégories (A, B, C) ont des champs spécifiques à chacun.
  • Un utilisateur a de nombreux éléments, un élément peut être utilisé par de nombreux utilisateurs.

    inventory_model_01
+0

Merci Damir, c'est similaire à ce qu'Andomar a suggéré plus haut. S'il vous plaît voir mon commentaire là-bas. Belle esquisse :) – Colnector

Questions connexes