我在这里要问一个问题,你们中许多人已经问自己,我想。我正在创建一个PHP网站,并且一切都一直顺利运行,直到我决定用一些测试数据(实际数据,当应用程序开始真正使用时,将会变得更大)填充我的数据库为止。大多数情况仍然可以正常工作,但是一个特别的(并且非常重要的)功能开始执行时间为三到四秒,而且大部分时间都花在了MySQL服务器上。许多(很多)SQL连接VS多个查询
这里的交易:我建立一个应用程序的一所学校,它需要将所有每天的时间表和教训,每一个人,每一个房间,每一个类。数据库的结构做了,创建索引,等等的问题是,由于所有这些数据是关系(并且可以跨多台传播)一个查询来获取他们都可能是这样的:
SELECT field1, field2, etc
FROM schedules AS su
LEFT JOIN schedules_lessons AS sul
ON sul.ID_SCHEDULE = su.ID
LEFT JOIN schedules_lessons_teachers AS sult
ON sult.ID_LESSON = sul.ID
LEFT JOIN users AS u
ON u.ID = sult.ID_TEACHER
LEFT JOIN schedules_periods AS sup
ON sup.ID_SCHEDULE = su.ID
LEFT JOIN schedules_periods AS sulp
ON sulp.ID_SCHEDULE = sul.ID_SCHEDULE AND sulp.period = sul.period
LEFT JOIN schools AS s
ON s.ID = su.ID_SCHOOL
LEFT JOIN schools_buildings AS sb
ON sb.ID_SCHOOL = s.ID
LEFT JOIN schools_rooms AS sr
ON sr.ID = sul.ID_ROOM
LEFT JOIN schools_classes AS sc
ON sc.ID = sul.ID_CLASS
是啊,这是一个很大的加入,我知道了。我的问题是:我应该如何在数量或查询的连接数&之间取得最佳平衡?因为我觉得这样可以真正改善,但我不知道如何实现它。
大多数表将在200的记录数,只有教训表可以有其它更多地方。最小值约为5k,最大值可以是30k或更多。
不知道你的模式是不容易给意见,但是从你的查询猜测它,似乎有什么不对劲的地方。为了提高性能,您是否已在所有表格中正确编制了所有相关字段(示例中的所有外键)的索引?此外,第二次加入'schedules_periods AS sulp'似乎是多余的,只需将第一次加入更改为'LEFT JOIN schedules_periods AS sup sup.ID_SCHEDULE = su.ID AND sup.period = sul.period'。关于查询长度,您可以使用一些视图来缩短查询时间。规范化的数据库没有错。 – Eggplant
像这样的东西是nosql闪耀的地方..那是可怕的看看。 – sircapsalot
@Eggplant嗨。那么,事实是(冗余)查询是我用来完成排序工作的一个小技巧。这有点难以解释。这是因为这些时间段是特定于时间表的,这意味着它们对于每个时间表都是不同的。因此,我不仅要选择与课程相对应的时间段,还要选择与整个时间表相对应的时间段,而只是在课程开始时排序。 :) –