学校数据库的正常化将使性能更好

时间:2017-09-19 19:04:17

标签: mysql sql database performance normalization

我有旧的服务器和巨大的MySQL数据库的学生标记 所有学生只有一张公用表:

  

student_id | teacher_id |标记|评论

这个项目有6所学校,约有800名学生,每天我们有〜5000个分数

学生在性能方面存在问题 - 每次查询他们的分数大约需要两分钟才能得到结果 顺便说一句,我使用表索引

我有一个问题 - 如果我使用规范化并为每个这样的学生制作单独的表:

STUDENTS_TABLE

student_id | table
ivanov     | ivanov_table

IVANOV_TABLE

teacher_id | mark | comment
它会帮助我提高性能吗?

我没有购买新服务器的机会。

ADD: 当我使用mysql> SELECT * FROM all_students_table where student_id=001时需要很长时间。我认为这是因为所有学生的信息都在一张巨大的桌子上。我想如果每个学生都会创建一个单独的表 - 这样的查询将花费更少的时间:mysql> SELECT * FROM student_001_table。我是对的吗?

ADD: 这张桌子已经三年了 mysql> SELECT COUNT(*) FROM students_marks

给出结果2 453 389行并且每天都在增长

2 个答案:

答案 0 :(得分:1)

由于像SELECT * FROM all_students_table where student_id=001这样的简单查询花费的时间太长,唯一明智的结论是该表没有适当的索引。这样的查询需要 student_id上的索引。当该索引存在时,查询应该对250万行执行几乎与对1,000行一样好(假设每个student_id在表中频繁出现)

答案 1 :(得分:0)

首先,@ Arjan关于索引的内容。 其次,根据经验,你需要至少3个表,可能还需要5个表,其中包含非常精确的INDEX和PRIMARY KEYS

  1. 学校
  2. 教师
  3. 学生
  4. Student_In_School
  5. Student_Grade(链接老师/学生/年级/评论)< - 您当前的表
  6. 第三,这是违反直觉的,性能会下降,因为你必须搜索多个表并链接它们。规范化不是为了提高性能,而是为了进行健全性检查和验证以及消除重复信息。例如,您现在可以拥有教师/学生的实际名称,而不是隐藏的ID。

    好消息是你的数据非常少(不管你怎么想),旧机器可以用适当的索引来处理它

    希望这有帮助