【问题标题】:will normalization of school database make better perfomance学校数据库的规范化会带来更好的性能吗
【发布时间】:2018-02-28 16:29:00
【问题描述】:

我有旧的服务器和庞大的学生成绩 MySQL 数据库 所有学生只有一张公用表:

student_id |教师编号 |标记 |评论

这个项目有六所学校和大约 800 名学生,每天我们有大约 5000 分

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

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

STUDENTS_TABLE

student_id | table
ivanov     | ivanov_table

IVANOV_TABLE

teacher_id | mark | comment

它会帮助我提高性能吗?

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

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

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

给出结果 2 453 389 行,它每天都在增长

【问题讨论】:

  • 您需要将范围缩小到特定查询和更具体的问题描述。
  • 我同意 @tadman 的观点,只是提一下,尽管 den-normalized 数据更适合报告应用程序
  • 为每个学生制作一个单独的表格并不是规范化的。根据您向我们展示的内容,日期字段可能会有所帮助,因此您可以对其进行过滤。
  • 显示您的表 DDL (CREATE TABLE...) 和运行 EXPLAIN SELECT * FROM all_students_table where student_id=001 的结果。然后SET profiling = 1,再次运行SELECT... 查询,并发布SHOW profile 的结果。
  • 另外,不要为每个学生创建一个表!

标签: mysql sql database performance normalization


【解决方案1】:

首先,@Arjan 对索引说了什么。 其次,根据经验,您将需要至少 3 个表,并且可能需要 5 个具有非常精确 INDEXes 和 PRIMARY KEYS 的表

  1. 学校
  2. 教师
  3. 学生
  4. Student_In_School
  5. Student_Grade(链接教师/学生/成绩/评论)

第三,这与直觉相反,性能会下降,因为您必须搜索多个表并链接它们。规范化不是为了性能,而是为了健全性检查、验证和消除重复信息。例如,您现在可以拥有教师/学生的实际姓名,而不是晦涩的 ID。

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

希望对你有帮助

【讨论】:

    【解决方案2】:

    由于像SELECT * FROM all_students_table where student_id=001 这样的简单查询耗时太长,唯一合理的结论是该表没有适当的索引。像这样的查询需要student_id 上建立索引。当该索引存在时,查询对 250 万行的执行性能几乎与对 1,000 行的执行性能一样好(假设每个 student_id 在表中出现的频率相似)

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2010-10-07
      • 2018-01-27
      相关资源
      最近更新 更多