2012-10-20 18 views
4

我收集與分類表像人們標籤主題如何:MySQL數據庫結構:多列或多行

ID | topic_id | votes_Category_1 | votes_Category_2 |.......... | votes_Category_12 

我轉儲這個表中的每個小時的歷史原因。 可以說表包含200萬行。歷史表中每小時都會拋棄。

該解決方案是不靈活,如果我想添加列Category_13,所以我想這一個:

ID | topic_id | Category_id | vote_count 

該解決方案將創建每個主題12行,其結構更好,更靈活,但我必須每小時轉儲2400萬行。

我需要每個類別中最好的10個主題! 我不知道在案例2中,如果在票數上使用Max(其中category_id = x和topic_id = y)將比案例1中慢:order by categoy_x where topic_id = y

哪一個會更好?從性能立場來看:

  1. 有2個百萬行的14列
  2. 要與4列

2400萬行謝謝

+0

其實是切換到NoSQL數據庫的一個很好的例子。 :-) – skovalyov

+1

不要忘記,option1 +由votes_category_xxx排序將需要XXX索引。標準化版本(option2)將具有固定數量的索引/鍵約束。 – wildplasser

回答

2

我想看看檢索模式,以決定方法。

  1. 如果檢索按類別的主題,那麼我會用第二種方法去,在類別字段定義索引,使所有給定類別中的記錄在磁盤上的連續存儲(相對),導致以較少數量的磁盤頁面進行檢索。這也是因爲與所有類別爲列的表相比,記錄大小更小。優點是可以輕鬆地添加更多類別,缺點是重複影響數據總大小的(ID,TopicID)列數據。

  2. 如果您按主題檢索,那麼我會採用第一種方法,定義主題索引。這將減少每個類別的(ID,TopicID)列值的重複,從而減少要存儲的數據的總大小,並且由於行數以每小時百萬爲單位,所以這種大小的減小必須是顯着的。缺點是需要修改新類別的模式。

編輯: 考慮您編輯檢索模式:

我取回的熱門主題和每個類別的自己的價值觀,所以我通過votes_Category_x的情況下,1

訂購我理解爲Find the top N topics with largest number of votes in a given category

在情況2我會尋找每個topic_id最大(類別)。

而這個爲SELECT TopicID, MAX(votes) FROM TABLE GROUP BY TopicID, Category

對於2百萬行和2,400萬行記錄的大小是不同的,但是,ID和TopicID是重複的,肯定會增加數據大小,每個記錄8個字節。

第一個表存儲200萬條記錄,每條記錄的大小分別爲60 bytes (4*15 ints),第二個表存儲了每條記錄大小爲16 bytes (4*4 ints)的2400萬條記錄。第二張表格每小時添加~62頁面4KB。似乎在一段時間內的關注。這也會影響由於在中間插入數據而導致的碎片化,因爲在第二種方法的情況下索引按類別組織。

在繼續使用表結構之前,可能需要運行一些性能測試以更好地理解此類性能,並且還要權衡添加類別的頻率。

+0

謝謝你的回答。我編輯了帖子 – ntg

+0

@ntg,根據我對編輯的理解更新了回覆。 – Vikdor

+0

你說得對。我需要每個類別中最好的10個主題。它肯定更加靈活,但我不確定mysql如何在2400萬行上執行(情況2),而不是200萬行(情況1) – ntg