繁体   English   中英

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

[英]Many (many) SQL JOINs vs Multiple queries

我想是在这里问一个问题,你们中许多人已经问过自己了。 我正在创建一个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,甚至更高。

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

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

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

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

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

您应尽可能让数据库处理联接,并避免进行不必要的查询。 从理论上讲,这应该是最佳的。 只要所有连接字段都已建立索引,您的查询就可以了。 所声明的容量并不惊人,并且响应时间应该很好(再次,前提是创建了所有索引)。 请记住,很少有返回很多记录的查询(当然是报告),这在应用程序中应该使用分页来控制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM