2016-12-16 79 views
0

我想知道下面哪種方法更快?1表查詢與連接多個表查詢性能

假設:

  • 最大10,000種產品,每種產品都有1個用戶ID,1個貓ID,3個額外的字段,以及5張圖片。
  • 90-99%的用戶來到網站只是爲了獲取信息,而不是發佈。

方法1:從查詢得到一個表中的所有數據,而 「加盟」:

SELECT * FROM products WHERE ... 

表:產品

id | name | poster_name | cat_name | code_1 | code_2 | content | 
     dimensions | contact | message | images | 

方法2:得到的所有數據帶「JOIN」的多個表格:

SELECT ... FROM products 
      LEFT JOIN cats ON products.cat_id = casts.id 
      LEFT JOIN users ON .... 

表:產品

id | name | code_1 | code_2 | content | cat_id | poster_id | 

表:貓

id | cat_name | 

表:用戶

id | poster_name | 

表:額外

id | product_id | extra_info | extra_data | 

表:圖像

id | product_id | img_src | 
+2

什麼是JOINT? – Agalo

+0

@Agalo我用記事本來代替輸入錯誤,然後得到另一個錯字=))抱歉 –

+0

查詢的性能取決於很多事情,並且可能因系統而異。例如,你是否定義了任何索引?這些表中有多少條記錄?一個表上的查詢幾乎總是比連接快,但它依賴於其他事情。如果您的一個表查詢獲得了一百萬條記錄,但您的連接只取得10條記錄,則該連接可能(但不一定)會更快。很明顯,對你而言,簡單的測試就是最好的答案。 –

回答

1

第一種方法通常會更快讀取,第二個將幫助您維護數據的完整性,通常會更快寫作。

從後面的形式到前者的轉換稱爲denormalization,通常用於數據倉庫,而操作(「活動」)數據庫通常更喜歡後面的形式(第二種方法)。

+0

如果大多數用戶(90-95%)只是訪問閱讀網站上的信息。而且數據庫結構不需要經常更改。在這種情況下,方法1更好嗎? –

+0

這取決於您的特定設置和需求。如果我確信我絕對需要提高性能,並且不能以其他方式獲得(例如,改進索引,調整執行計劃等),我個人只會考慮方法1。另請注意,方法1消耗更多空間。 –

+0

當你說「方法1佔用更多空間」時。這意味着你在組合表中計算了NULL值,如果我使用方法2:我可以保存這些空間?我想如果所有的字段都包含數據,這兩種方法都會佔據相同的空間。 –

1

你還沒有完成提問。方法2沒有WHERE,所以它將提供10K行,並且必須對其他表執行20K查找。這使它成爲失敗者。

由於您的真的問題是關於性能,那麼讓我們來討論WHERE條款。因此,我們可以對其進行優化,以使所需的數據趨向於RAM中。

回到你的問題... JOIN可能是「正確」的方式來做到這一點。假設你有適當的索引,那麼它的性能並沒有太大的提高。所以提供SHOW CREATE TABLE(即使是暫定的)和完整的WHERE條款。

不要過度歸一化。例如,不要標準化日期時間或任何其他「連續」值。

規範化可以節省空間,特別是在巨大的表格中(例如,數百萬或數十億行,以及規格化的大型,頻繁重複的字符串)。當表格太大而無法保留在RAM中時,這特別有用。