我开发了一些程序,可以自动生成一些代码,用于在 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 = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="304455434470445543441e535f5d" rel="noreferrer noopener nofollow">[email protected]</a>"
它根据电子邮件地址选择业务合作伙伴。 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 个以上连接的合法示例?
如有任何帮助,我们将不胜感激。
最佳答案
您的查询看起来没问题。我进行了多达 10 次连接,没有出现性能问题。
有关 MySQL 性能的一些有趣事实:
始终使用 MySQL
引号
。我的任务是提高困惑查询的性能。我做的第一件事是以可读的方式排列代码并添加引号。结果性能提升了 10%。始终按索引数字字段进行连接,并且切勿在连接中使用两个条件,除非不存在其他选项,因为它会降低性能。
在 where 条件中,始终按照首先选择索引数量最少的顺序添加它们,这可以带来高达 99% 的性能提升。
只是我的两分钱。
关于MySQL (InnoDB) - 有多少连接才有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580169/