2

我开发了一些程序,可以自动生成一些代码,用于在 Java 中以结构化方式自动生成查询。

我添加的最新选项是获取一个表的结果,同时实际指定其他表的约束。唯一的先决条件是这些表具有彼此的外键。

我将在这里只处理实际的 SQL 查询。

这是一个经常使用的有效 SQL 查询:

SELECT businessPartners.businessPartnerId, businessPartners.name
FROM businessPartners
JOIN BP_emails ON businessPartners.businessPartnerId = BP_emails.businessPartnerId
JOIN emails ON BP_emails.emailId = emails.emailId
WHERE emails.email = "test@test.com"

它根据电子邮件地址选择业务合作伙伴。businessPartners.businessPartnerId并且emails.emailId都是主键并且BP_emails里面有外键。

类似的结构被用于发票以及发票和电子邮件之间的链接。

所以我还发现(并验证)可以执行此查询:

SELECT businessPartners.businessPartnerId, businessPartners.name
FROM businessPartners
JOIN BP_emails ON businessPartners.businessPartnerId = BP_emails.businessPartnerId
JOIN emails ON BP_emails.emailId = emails.emailId
JOIN INV_emails ON emails.emailId = INV_emails.emailId
JOIN invoices ON INV_emails.invoiceId = invoices.invoiceId
WHERE invoices.invoiceId >=1
AND invoices.invoiceId <=1

首先,我很难弄清楚它到底是什么意思:我认为它的意思是:给我所有的业务合作伙伴,这些业务合作伙伴拥有invoices.invoiceId = 1并且与发票相关的电子邮件与与业务合作伙伴相关的电子邮件相同。 . 所以我觉得没多大意义。

所以问题是:直到哪里多连接才真正有意义?在我的第一个示例中,我已经需要两个连接,是否有需要 3 个以上连接的合法示例?

任何帮助将不胜感激。

4

3 回答 3

1

我听说的经验法则是 JOIN 中超过 7 个表太多了。

这里的关键不是 JOIN 的数量,而是 WHERE 子句的正确顺序。SQL 是基于集合的,因此如果您首先执行排除最大行数的 WHERE 子句,您将为后续过滤器节省工作量。

索引也会影响性能。确保在 WHERE 子句中的所有列上都有索引。

不用说,每个表都必须有一个主键,这就是你应该加入的。

对不起,这是愚蠢的:

WHERE invoices.invoiceId >=1
AND invoices.invoiceId <=1

如果这是为您自动生成的示例,我会说您需要一个更好的生成器。

于 2013-07-10T20:23:31.893 回答
1

您的查询看起来不错。我有多达 10 个连接,性能没有问题。

关于 MySQL 性能的一些有趣的事实:

  1. 始终使用 MySQL quotes。我的任务是提高杂乱查询的性能。我做的第一件事是以可读的方式排列代码并添加引号。结果是性能提高了 10%。

  2. 始终通过索引数字字段连接,并且永远不要在连接中使用两个条件,除非没有其他选项存在,因为它会降低性能。

  3. 在 where 条件下,总是按照将选择最少数量的索引的顺序添加它们,这可以带来高达 99% 的性能提升。

只是我的两分钱。

于 2013-07-10T20:59:18.177 回答
0

很难说真的我怀疑这个例子有太多问题,尽管承认它有点笨拙。鉴于您正在做的事情,冗长的 sql 并不是什么大问题,因为您将它隐藏在一些希望更具表现力的演示文稿后面。我会犹豫是否对您可以表达的关系数量进行任意限制。如果结果很慢,那么这是架构更改,据我所知,超出了范围。

于 2013-07-10T20:57:13.167 回答