2017-09-19 1 views
0

J'ai ancien serveur et base de données énorme de MySQL de marques étudiants Il n'y a qu'une seule table commune pour tous les élèves:va normalisation de la base de données de l'école mieux perfomance

student_id | teacher_id | marque | commentaires

Il y a six écoles dans ce projet et ~ 800 étudiants, tous les jours que nous avons ~ 5000 des marques

Les élèves ont un problème perfomance - toutes les requêtes de leurs marques prend environ deux minutes pour obtenir des résultats par la façon dont j'utiliser l'indexation de la table

J'ai la question - si j'utilise la normalisation et faire table distincte pour chaque élève comme ceci:

STUDENTS_TABLE

student_id | table 
ivanov  | ivanov_table 

IVANOV_TABLE

teacher_id | mark | comment 

il va aider me faire mieux perfomance?

Je n'ai aucune opportunité d'acheter un nouveau serveur.

AJOUTER: lorsque j'utilise mysql> SELECT * FROM all_students_table where student_id=001 cela prend beaucoup de temps. Je pense que c'est à cause de l'information de tous les étudiants dans une grande table. Et je suppose que si une table individuelle pour chaque étudiant sera créée - cela prendra moins de temps pour une requête comme celle-ci: mysql> SELECT * FROM student_001_table. Ai-je raison?

ADD: Ce tableau est trois ans et mysql> SELECT COUNT(*) FROM students_marks

résultat donner 2 453 389 de lignes et il pousse tous les jours

+3

Vous aurez besoin de réduire cela à un particulier requête et une description plus spécifique du problème. – tadman

+1

Je suis d'accord avec @tadman, il suffit de mentionner que les données den-normalisées fonctionnent mieux pour les applications de reporting par exemple –

+4

Faire une table séparée pour chaque élève ne se normalise pas. En fonction de ce que vous nous avez montré, un champ de date peut vous aider à filtrer. –

Répondre

1

Depuis une requête simple comme SELECT * FROM all_students_table where student_id=001 prend trop de temps, la seule conclusion raisonnable est que la table n'a pas d'index appropriés. Une requête comme celle-ci nécessite un index sur student_id. Lorsque cet index est présent, la requête devrait fonctionner presque aussi bien pour 2,5 millions de lignes que pour 1000 lignes (en supposant que student_id apparaît de manière similaire fréquemment dans le tableau)

0

Tout d'abord, QU'a dit @Arjan sur les index. En second lieu, de l'expérience, vous aurez besoin d'au moins 3 tables et probablement 5 tables avec des index très précis et les clés primaires

  1. Écoles
  2. enseignants
  3. Étudiants
  4. Student_In_School
  5. Student_Grade (Liens enseignants/Student/Grade/Comment) < - Votre table actuelle

Troisièmement, et ceci est contre-intuitif, les performances diminueront, car vous devez rechercher plusieurs tables et les lier. Normalisation n'est pas pour la performance, mais plutôt pour les contrôles de santé et la validation et l'élimination des informations répétées.Par exemple, vous pouvez maintenant avoir les noms réels des enseignants/étudiants par opposition à un ID obscur.

Les bonnes nouvelles sont que vous avez très peu de données (malgré ce que vous pensez) et une vieille machine peut traiter avec INDICES appropriés

Hope this helps