我发现当尝试在许多表之间构建复杂的MySQL连接和组时,我经常遇到冲突,并且必须花费大量的“反复试验”来获得我想要的结果。
我想知道其他人是如何处理这些问题的。您是否在分支末尾隔离较小的数据块并使这些数据先工作?或者你从你想要返回的内容开始,然后根据需要开始链接表格?
还想知道是否有关于解决问题的好书或网站。
答案 0 :(得分:1)
分解MySQL查询的最佳方法是运行EXPLAIN命令以及查看Optimization with the EXPLAIN命令的MySQL文档。
MySQL提供了一些很棒的免费GUI tools,MySQL查询浏览器就是您需要使用的。
运行EXPLAIN命令时,这将分解MySQL如何解释您的查询并显示复杂性。解码输出可能需要一些时间,但这本身就是另一个问题。
至于一本好书,我建议:High Performance MySQL: Optimization, Backups, Replication, and More
答案 1 :(得分:1)
我不在mySQL中工作,但我经常写极其复杂的SQL,这就是我如何处理它。
首先,没有任何替代品可以彻底了解您的数据库结构。
接下来,我尝试将任务分解成块。
例如,假设我正在撰写一份关于会议细节的报告(我所工作的公司会议计划)。我需要知道会议名称和销售代表,会议地点和日期,参加人员和发言人信息。
首先,我确定哪些表将包含报告中每个字段的信息。现在我知道我将要加入的内容,但目前尚不清楚。
所以首先我写一个查询来获得我想要的会议。这是报告其余部分的基础,所以我从那里开始。现在报告的其余部分可能以任何顺序完成,虽然我更喜欢先处理应该有一对一关系的部分,所以接下来我将添加联接和字段,这将使我所有的销售代表关联信息。
假设我每次会议只需要一个代表(如果有多个代表,我只想要主代表),所以我检查以确保我仍然返回与我刚收到会议信息时相同数量的记录。如果不是,我会查看我的联接并决定哪一个给我的记录多于我需要的记录。在这种情况下,它可能是地址表,因为我们正在为rep存储多个地址。然后我调整查询只得到一个。这可能很简单(您可能有一个字段指示您想要的特定唯一地址,因此只需要添加where条件),或者您可能需要执行一些分组和聚合函数以获得所需的内容。
然后我继续下一个块(首先通过所有块,这些块应该与中心数据有1-1关系,在这种情况下是会议)。每次添加后,请查询并检查数据。
最后,我转到那些可能有一对多关系的记录并添加它们。我再次运行查询并检查数据。例如,我可能会检查特定会议的原始数据,并确保我的查询返回的内容正是我期望看到的内容。
假设在其中一个连接添加中,我发现不同会议的数量已经下降。糟糕,那么我刚添加的其中一个表中没有数据,我需要将其更改为左连接。
另一次我可能会发现太多记录已经返回。然后我看看我的where子句是否需要有更多的过滤信息,或者我是否需要使用aggreagte函数来获取我需要的数据。有时我会暂时向报告中添加其他字段,以查看是否可以看到导致重复数据的原因。这有助于我了解需要调整的内容。
真正的关键是慢慢地工作,理解你的数据模型并在添加每个新块后检查数据,以确保它以你认为应该的方式返回结果。
有时,如果我返回了大量数据,我会暂时在查询中添加一个additonal where子句,以限制我可以轻松检查的几个项目。我还强烈建议使用order by,因为它可以帮助您查看是否获得了重复记录。
答案 2 :(得分:0)
我自己没有使用它们,所以不能评论它们的有效性,但是基于GUI的查询构建器(例如dbForge或Code Factory)可能会有所帮助吗?
虽然使用维恩图来思考MySQL连接并不一定有助于SQL,但它们可以帮助您可视化您想要撤回的数据(参见Jeff Atwood's post)。