我已经开发了一些自动生成一些程序的程序,这些代码用于在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个以上连接的合法示例?
任何帮助都会受到赞赏。
答案 0 :(得分:1)
我听说过的经验是,JOIN中有七个以上的表太多了。
这里关键的不是JOIN的数量,而是WHERE子句的正确排序。 SQL是基于集合的,因此如果您执行排除最大行数的WHERE子句,您将为后续过滤器保存工作。
索引也会影响性能。确保在WHERE子句中的所有列上都有索引。
不言而喻,每个表都必须有一个主键,这就是你应该加入的。
抱歉,这是愚蠢的:
WHERE invoices.invoiceId >=1
AND invoices.invoiceId <=1
如果这是为您自动生成的示例,我会说您需要更好的生成器。
答案 1 :(得分:1)
您的查询看起来没问题。我有多达10个连接,没有性能问题。
有关MySQL性能的一些有趣事实:
始终使用MySQL quotes
。我的任务是改善凌乱的查询的性能。我做的第一件事是以可读的方式安排代码并添加引号。结果导致10%的表现飙升。
始终通过索引数字字段加入,并且从不在连接中使用两个条件,除非不存在其他选项,因为它是性能下降。
在条件总是按照将首先选择具有索引的最小数量的顺序添加它们,这可以使性能提高99%。
只是我的两分钱。
答案 2 :(得分:0)
很难说真的我怀疑这个例子是太多的问题,虽然不可否认它有些不合时宜。鉴于你正在做什么,冗长的sql并没有那么大的问题,因为你隐藏在一些希望更具表现力的演示背后。 我会毫不犹豫地说出你可以表达的关系数量的任意数量。如果事实证明它很慢,那么这就是模式的改变,据我所知,超出了范围。