许多(许多)SQL JOIN与多个查询

时间:2013-08-29 13:33:18

标签: php mysql sql performance relational-database

我想在这里问一个问题,你们许多人已经问过你们了,我想。我正在创建一个PHP网站,一切都运行得很顺利,直到我决定用一些测试数据填充我的数据库(真实数据,当应用程序开始被用于实际时,将会更大)。大多数事情仍然可以正常工作,但一个特定的(并且非常重要)功能开始执行时间为3到4秒,而且大部分时间都花在MySQL服务器上。

这是交易:我正在为学校建立一个应用程序,它需要为每一天,每个人,每个房间,每个班级提供所有的时间表和课程。完成数据库的结构,创建索引等...问题是,由于所有这些数据都是关系的(并且可以分布在许多表中),因此一个查询来获取它们可能看起来像这样:

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或更多。

3 个答案:

答案 0 :(得分:0)

如果您需要此信息并且表格已正确编入索引,那么您的连接查询应该是一种非常合理的方式来提取数据。您可以通过在查询之前添加explain来检查是否正在使用索引。

当你说“大部分时间花在MySQL服务器上”时,你是否考虑到返回数千行需要时间?您可以尝试执行相同的查询,但将select . . .替换为select count(*)以查看基础查询性能是什么。另一种方法是将order by <something> limit 1添加到现有查询中 - order by必须在返回结果之前完全处理查询。

最后,如果这只是一个问题,那么自从它按照你想要的方式发挥作用后会发生什么变化?

答案 1 :(得分:0)

我不是数据库专家,但也许仅在您的应用或网页中查询当前需要的数据库中的信息是有意义的。 我想这应该可以在相当短的时间内完成。 然后可以在实际需要时从数据库中查询其余部分。

请注意,数据库服务器正在内存中构建一个大表,其中所有联接都已合并。如果您的服务器内存太少,则可能难以构建此表。 (虽然在您的方案中可能不是这种情况......)

答案 2 :(得分:0)

尽可能让数据库处理联接,避免进行超出必要的查询。从理论上讲,这应该是最佳的。如果所有连接字段都已编制索引,那么您的查询似乎很好。 规定的数量并不是很壮观,响应时间也应该很好(再次提供所有索引都会创建)。 请记住,您应该很少有查询返回许多记录(当然是例外情况) - 在应用程序中,您应该使用分页控制它。