2011-04-07 90 views
1

例如,我們有三個表(會後,PostTag和Tag):自己的統計數據列或統計表?

Post 
======= 
id 
title 
body 

PostTag 
======= 
id 
post_id 
tag_id 

Tag 
======= 
id 
name 
normalized_name 

我們需要統計帖子多少包含一個標籤「運動」。計數查詢很慢(我們有幾百萬行)。

對於我們必須在數據庫中存儲計數的解決方案(添加標籤後,計數用n + 1更新,刪除n-1後)。

這些標籤經常被社區/管理員添加/刪除。

我的想法:

存儲的標籤數量創建自己的彙總表:

PostTagStat 
======== 
tag_id 
frequency 

該指數在列頻率產生。

但它會更好,如果我們增加新的列到變量表保存INNER JOIN這樣的查詢:

Tag 
======== 
id 
name 
normalized_name 
frequency 

你覺得呢?自己的表或新的列?爲什麼?

+0

PostTag表有tag_id字段上的索引嗎? – Devart 2011-04-07 08:46:31

+0

當然! tag_id字段上有一個索引。 – dreamcocoa 2011-04-07 08:51:11

+0

你能發佈您的查詢嗎?我曾想過,對單個tag_id的post標籤進行簡單查詢會很快。 – Jaydee 2011-04-07 11:49:15

回答

0

對於數據的查詢:

單一表或兩個表之間的選擇取決於其類型的查詢被用來比另一個更顯著。 如果大部分查詢都是關於標籤的基本列,那麼兩張表的性能會更好。如果大多數查詢需要標籤頻率,單個表格會更好。

然而,這兩種策略與性能差別不大,因爲只添加了一列(「頻率」列,我猜測有4個字節)。


對於數據的修改:

這兩個表的策略是多於一個的表策略稍慢因爲數據庫需要的表的數據的詳細記錄。

但我認爲修改的性能不是您的動機添加一列以加快查詢。所以修改的性能不應該成爲您考慮的問題。


系統一次又一次地工作後,您可以根據使用情況改變策略。