Mieux vaut créer une table pour chaque compte utilisateur, ou une énorme table pour toutes les données utilisateur dans MYSQL

8

Je crée un répertoire Web qui permettra aux utilisateurs individuels de créer un compte et de stocker essentiellement des documents texte dans une entrée de base de données mysql.

Au départ, il n'y aura probablement que quelques centaines d'utilisateurs, mais nous espérons en avoir 10 000 à 100 000 à un moment donné. Et chaque utilisateur pourrait télécharger 100 à 200 "documents".

Serait-il plus efficace de créer une table massive, indexée par un numéro d'utilisateur? Ce qui pourrait théoriquement atteindre 20 000 000 entrées. Ou pour aller de l'avant et créer un tableau pour chaque utilisateur avec ses documents individuels?

Je suppose que ce n'est pas sain d'avoir des milliers de tables dans une base de données, mais je ne peux vraiment pas trouver de données concrètes à ce sujet.

Keith
la source

Réponses:

7

MySQL peut facilement gérer 20 millions de lignes s'il est correctement indexé. Nous avons des tableaux contenant plus d'un milliard de lignes.

Avoir une table est plus propre. Pas besoin de faire de la magie dans l'application en fonction de l'utilisateur (nom). Il est également plus facile de créer des statistiques sur le tableau des documents.

J'irais certainement avec l'approche d'une grande table. Si vous êtes préoccupé par la taille (physique) de la table, vous devez envisager de partitionner la table des documents. http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html

Károly Nagy
la source
Merci pour la réponse. J'irai certainement avec une seule table alors, et je ferai des recherches sur l'approche de partitionnement. Une question cependant, que signifie exactement une table correctement indexée? J'entends beaucoup cela référencé et je suppose que cela signifie que la table de base de données a besoin d'une clé d'index correctement définie. Mais y a-t-il plus que cela pour la meilleure optimisation.
Keith
Avec correctement indexé, je voulais dire avoir au moins un index composite sur user_id avec les colonnes que vous filtrez ou triez sur la table de document et index sur le nom d'utilisateur sur la table utilisateur (probablement un index partiel suffit pour vérifier la cardinalité 90-95 % est assez). Par exemple: sqlfiddle.com/#!2/9fb15/2 (Dans mon cas avec un index partiel 5 sur le nom d'utilisateur, la cardinalité est de 50%)
Károly Nagy
Je pense que je comprends, merci pour l'aide. Une autre question, en supposant que vous avez une clé d'index primaire pour chaque table, cela aide-t-il toujours l'optimisation à définir des colonnes supplémentaires que vous savez que vous rechercherez régulièrement (comme la catégorie parent) comme index? Y a-t-il un inconvénient à définir une clé primaire ou unique et 2 à 4 index pour chaque table?
Keith
Les index aideront, oui. En fait, vous devriez toujours avoir des index sur les colonnes sur lesquelles vous filtrez, sinon la requête se terminera par une recherche d'analyse complète. Le seul inconvénient (en plus de la taille de l'index) est des insertions et des mises à jour plus lentes, car depuis 5.1 avec le plug-in InnoDB et 5.5 par défaut, MySQL a une création d'index rapide ( dev.mysql.com/doc/refman/5.5/en/… ) donc ce n'est pas le cas un gros problème plus.
Károly Nagy