2013-07-10 25 views
2

我已經開發了一些自動生成一些用於在Java中以結構化方式自動生成查詢的代碼的程序。MySQL(InnoDB) - 有多少聯接有意義?

我添加的最新選項是獲取一個表的結果,同時實際指定其他表的約束。唯一的先決條件是這些表有彼此的外鍵。

我只會在這裏處理實際的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 = "[email protected]" 

它可以選擇根據自己的電子郵件住址的商業夥伴。 businessPartners.businessPartnerIdemails.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個連接的合法示例?

任何幫助,將不勝感激與此。

回答

1

我聽說的經驗法則是JOIN中超過7個表格太多。

這裏關鍵的不是JOIN的數量,而是WHERE子句的正確排序。 SQL是基於集合的,因此如果您首先執行排除最大行數的WHERE子句,則可以爲後續篩選器保存工作。

索引也會影響性能。確保你在WHERE子句中的所有列上都有索引。

毫無疑問,每個表都必須有一個主鍵,這就是你應該加入的。

對不起,這是愚蠢的:

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

如果這是爲你自動生成的東西是一個例子,我說你需要一個更好的發電機。

+0

好的,這是有用的技術洞察力,絕對是你答案的第二部分。但是現在我對邏輯部分更感興趣了。因爲我的90%自動生成的東西似乎只是針對「無意義」查詢的準備,這些查詢永遠不會被使用。 – skiwi

0

很難說真的我懷疑這個例子太多的問題,雖然承認它有點不起眼。鑑於你在做什麼,冗長的sql並不是什麼大問題,因爲你將它隱藏在希望更富有表現力的表現背後。 我會毫不猶豫地將你所能表達的關係的數量限制在任意數量。如果結果變得緩慢,那麼這是一個架構變化,並且據我所知,範圍之外。

1

您的查詢看起來沒問題。我有多達10個連接,在性能上沒有問題。

關於MySQL性能的一些有趣的事實:

  1. 始終使用MySQL quotes。我的任務是改善雜亂查詢的性能。我做的第一件事是以可讀的方式安排代碼並添加引號。結果表現爲10%的表現。

  2. 總是通過索引數值字段進行連接,並且從不在連接中使用兩個條件,除非沒有其他選項存在,因爲它是性能下降。

  3. 在條件總是添加它們的順序中,首先選擇最少的索引量,這可以帶來高達99%的性能提升。

只是我的兩分錢。