gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:21:12 25 4
gpt4 key购买 nike

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

事情是这样的:我正在为一所学校构建一个应用程序,它需要包含每天、每个人、每个房间、每个类(class)的所有时间表和类(class)。数据库的结构已完成,索引已创建,等等...问题是,由于所有这些数据都是关系数据(并且可以分布在许多表中),获取所有数据的一个查询可能如下所示:

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 以下,只有类(class)表的记录数可以更多。最小值接近 5k,最大值可能约为 30k 或更多。

最佳答案

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

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

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

关于php - 许多(许多)SQL JOIN 与多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18512465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com