如何编写/优化需要从 6 个相关表中选择数据的 sql 查询,直到获得所需的数据
Posted
技术标签:
【中文标题】如何编写/优化需要从 6 个相关表中选择数据的 sql 查询,直到获得所需的数据【英文标题】:How to write/optimize sql query that need to select data from 6 related tables until it get what it need 【发布时间】:2015-02-26 20:32:26 【问题描述】:我正在编写基于 mysql 数据库的 php 应用程序,供 5-6 个应用程序共享它。正因为如此,我不能改变数据库结构,我知道你们很多人会说先这样做,但不幸的是我不能。
这是我的数据库架构、正在使用的查询和所需输出的 SQL 小提琴:
http://sqlfiddle.com/#!2/de7493/1
我的解决方案正在处理这个示例数据库,但在实际生产数据库中,其中一些表的行数超过 1m,当我尝试运行它时,我的数据库崩溃了。即使我将这个 sql 缩减为仅从 3-4 个表中进行选择,它仍然会崩溃。也许这是不可能的,也许我做错了。这是我必须做的:
我从 url 动态获取 cpv_id。在我的示例中,cpv_id 是 66113000。基于该值,我必须找出与该 cpv_id 相关的俱乐部报价。然后根据这些提议,我必须发现哪些俱乐部成员有这些提议。 (俱乐部成员是公司)。然后基于俱乐部成员ID,我必须发现一些关于俱乐部成员公司的信息,在这些数据中我必须发现公司special_id。基于那个 special_id 我必须阅读公司报告。
所以基本上:根据 cpv_id,我必须找到公司报告,以发现有与该 id 相关的俱乐部优惠的公司(简单对吗?)。从我的表在 SQLFiddle 中的关联方式可以看出,我需要通过 6 个表来获得我真正需要的东西。再一次,我不能改变数据库结构。
这是一件很复杂的事情,恐怕你不会明白我需要什么。我希望 SQLFiddle 会有所帮助。如果您还有其他问题,请随时问我。
所以考虑到我的解决方案,我的查询,如果我运行它会因为数据库崩溃而失败。有什么办法可以得到想要的结果吗?我可以以某种方式优化这个查询,还是我需要写一些其他的,或者做其他事情?我很迷茫,因为我从来没有为了得到想要的结果而深入到这么多表中读取数据。
谢谢, 安妮塔
【问题讨论】:
【参考方案1】:这似乎做同样的事情:
SELECT DISTINCT company_report.*
FROM company_report,
company,
users,
club,
club_offer,
club_offer_cpv
WHERE company_report.company_special_id = company.special_id AND
company.id = users.company_id AND
users.id = club.users_id AND
club.id = club_offer.club_id AND
club_offer.id = club_offer_id AND
club_offer_cpv.cpv_id = 66113000
其他人会更喜欢连接,但我发现这更容易阅读,而且它们是等价的。它看起来像这样:
SELECT DISTINCT company_report.*
FROM company_report
JOIN company ON company_report.company_special_id = company.special_id
JOIN users ON company.id = users.company_id
JOIN club ON users.id = club.users_id
JOIN club_offer ON club.id = club_offer.club_id
JOIN club_offer_cpv ON club_offer.id = club_offer_id AND
club_offer_cpv.cpv_id = 66113000
实际上,这还不错,我的意思是我什至可能更喜欢最后一个。
【讨论】:
我就是这样做的。我唯一要添加的是使用MySQL's EXPLAIN,以防仍然需要很长时间,因为可能存在已损坏或不存在的索引。 是的,您需要正确的索引。它似乎在 SQLFiddle 中运行良好。 谢谢大家,明天我将在具有真实数据库的生产服务器上尝试这些解决方案,我希望它会起作用。祝我好运:D 我已经用新的请求扩展了这个问题。你能检查一下吗? ***.com/questions/28794767/…谢谢【参考方案2】:为您的表关系 id 添加索引,然后尝试使用左外连接逐个添加表
【讨论】:
以上是关于如何编写/优化需要从 6 个相关表中选择数据的 sql 查询,直到获得所需的数据的主要内容,如果未能解决你的问题,请参考以下文章