2009-12-04 64 views
1

這個問題是關於性能,而不是關於可能的解決方案。MySQL:將一個表分成多個表(相同的列)以提高性能?

我的系統包含許多不同類別的項目。每個類別都有自己的表格,因爲每個表格都有很多行,而且這些字段是不同的。

ItemA - id, fld1, fld2 
ItemB - id, fld1, fld3, fld4 
ItemC - id, fld1, fld3, fld5 
.... 

現在需要管理用戶庫存,這意味着用戶有一個物品或沒有物品。一種選擇是使用單個表:

Inventory - category_id, item_id, user_id 

CATEGORY_ID是意達,ItemB,...行不同的,這就是我們如何區分。

第二個選項是有:

InventoryA - item_id, user_id 
InventoryB - item_id, user_id 
... 

第一個選項可能是最容易管理,但庫存表是巨大的:和經常(量級上的所有類別的次用戶數量的項目數)更新並經常查詢。

第二個選項會更難管理(因爲我們爲每個類別創建一個新的庫存表),但可能會引入性能增益,因爲它可能會阻止競爭條件。沒有單個查詢可能需要涉及多個庫存表,因爲這些類別是相當分離的。

目前系統使用MySQL和InnoDB引擎。 有〜10個類別,但預計在不久的將來會增長到幾十個。最大的類別有> 200k項目,大部分類別> 10k項目。 單個庫存表具有> 10M行,並且隨着更多用戶加入,預計將獲得更多。

我知道最好的是測試這兩種方法的性能和決定,但事實是,它將不會如此快速和無痛地移動到多表設計。

如果您有個人經驗有類似的問題,請分享。

感謝

+0

可以將一個項目被很多用戶所擁有(使用)? – 2009-12-04 22:55:27

+0

是達米爾,這是一個多對多的關係。 – Colnector 2009-12-05 09:54:20

回答

4

正火的數據庫通常是性能和可維護性好。

該方法將創建與ItemA,ItemB等具有1:1關係的表Items。然後,您可以創建一個與基表Items表具有關係的Inventory表。

根據documentation,InnoDB支持行級鎖,因此不需要使用多個表來防止死鎖。

+0

謝謝Andomar的回答。恕我直言,但是,你的建議實際上是一個非常糟糕的主意,會進一步降低性能。 目前,我已經介紹了第一個解決方案。數據庫上的每個查詢都只涉及其中一個類別,我真的無法理解如何添加額外的Items表來提高性能。規範化是一個很好的概念,但這裏的問題是關於實際的性能影響。 是的,InnoDB支持行級鎖,但它不是我害怕的死鎖,而是性能下降。 – Colnector 2009-12-05 10:11:03

+0

@Colnector:添加一個基表允許你在'inventory'和'item'之間有一個外鍵關係 – Andomar 2009-12-05 10:46:46

+0

是的@Andomar,我明白,但是我真的不明白這是如何幫助我解決我所問的。目前我有庫存(category_id,item_id,user_id)和您的建議,我會有庫存(item_id,user_id),但我將不得不加入新的項目表爲每個和每個查詢。這會降低性能。 – Colnector 2009-12-05 11:17:55

1

這裏是我對這個故事的看法,希望這會有所幫助。

  • 項目表具有所有項目通用的字段。
  • 類別(A,B,C)表具有特定於每個表的字段。
  • 一個用戶有很多項目,一個項目可以被許多用戶使用。

    inventory_model_01
+0

感謝達米爾,這與Andomar上面提到的類似。請在那裏看到我的評論。好的草圖:) – Colnector 2009-12-05 10:12:05