2017-09-19 11 views
0

私は古いサーバーと学生のマークの巨大なMySQLデータベースを持っている すべての学生のための唯一の共通のテーブルがあります:学校データベースの正規化は、より良いもパフォーマンスになります

STUDENT_IDは| teacher_id |マーク| 6つのプロジェクトでは、学校や生徒の〜800、日常のマーク

の生徒5000〜あり、我々が持ってい

コメントもパフォーマンスに問題がある - 彼らのマークのすべてのクエリは、結果を得るために約2分かかり 私は疑問を持っているテーブルのインデックス

を使用する方法によって、 - 私は正規化を使用して、このようなすべての学生のための別のテーブルを作成する場合:

STUDENTS_TABLE

student_id | table 
ivanov  | ivanov_table 

IVANOV_TABLE

teacher_id | mark | comment 

それは私がより良いもパフォーマンスをする助けとなるでしょうか?

私は新しいサーバーを購入する機会がありません。

追加: mysql> SELECT * FROM all_students_table where student_id=001を使用すると時間がかかります。私はすべての学生の情報が1つの巨大なテーブルにあるためだと思います。そして、私はすべての生徒のための個々のテーブルが作成されると仮定します - それはこのようなクエリのための時間がより少なくなります:mysql> SELECT * FROM student_001_table。私は正しい?

ADD: この表は、3歳と、唯一の賢明な結論を mysql> SELECT COUNT(*) FROM students_marks

は、行の2 453 389結果を与えるとSELECT * FROM all_students_table where student_id=001のような単純なクエリは時間がかかりすぎるので、それは毎日

+3

を支援質問とその問題のより具体的な説明。 – tadman

+1

私は@tadmanに同意しますが、den-normalizedデータは報告用アプリケーション(例えば –

+4

など)の方が優れていますが、学生ごとに別のテーブルを作成するのは正規化ではありません。あなたが私たちに示したことに基づいて、日付フィールドが役立つかもしれませんので、それをフィルタリングすることができます。 –

答えて

1

を育てますテーブルに適切なインデックスがないことです。このようなクエリは、のインデックスとstudent_idのインデックスが必要です。そのインデックスが存在する場合、クエリーは1,000行と同じように250万行でほぼ同じパフォーマンスを発揮するはずです(student_idがテーブルに同様に頻繁に出現するとします)。

0

まず、@Arjanはインデックスについて述べています。 第二には、経験から、あなたには、少なくとも3つのテーブルと非常に正確なインデックスやPRIMARY KEYS

  1. 学校
  2. 教師
  3. 学生
  4. Student_In_School
  5. Student_Grade(リンク教師とおそらく5テーブルが必要になります/学生/グレード/コメント)< - あなたの現在のテーブル

第3に、これは直感的ではなく、複数のテーブルを検索してリンクする必要があるため、パフォーマンスが低下します。正規化はパフォーマンスのためではなく、正当性チェックと繰り返し情報の検証と排除のためのものです。たとえば、わかりにくいIDではなく、実際の教師/生徒の名前を持つことができます。

良いニュースは、あなたが(あなたがどう思うかにかかわらず)非常に小さなデータを持っているし、古いマシンは、適切な索引を持つ

をそれを扱うことを願って、これはあなたが特定にこれを絞り込む必要があります

関連する問題