0

我想问一个你们很多人已经问过自己的问题,我想。我正在创建一个 PHP 网站,一切运行顺利,直到我决定用一些测试数据填充我的数据库(真实数据,当应用程序开始真正使用时,它会变得更大)。大多数事情仍然可以正常工作,但是一个特定的(并且非常重要的)功能开始具有三到四秒的执行时间,其中大部分时间都花在了 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 或更多。

4

3 回答 3

0

您应该尽可能让数据库处理连接,并避免进行不必要的查询。理论上这应该是最优的。如果所有连接字段都已编入索引,您的查询似乎很好。规定的数量并不引人注目,响应时间应该没问题(再次提供所有索引都已创建)。请记住,您应该很少有返回许多记录的查询(当然报告是例外) - 在应用程序中,您应该通过分页来控制它。

于 2013-08-29T13:44:14.700 回答
0

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

请注意,数据库服务器正在内存中构建一个大表,所有连接都在其中合并。如果您的服务器内存太少,则构建此表可能会遇到困难。(尽管在您的情况下可能并非如此......)

于 2013-08-29T13:41:04.763 回答
0

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

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

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

于 2013-08-29T13:39:18.403 回答