2010-04-29 74 views
2

我們有一個用於products的mySQL數據庫表。我們正在利用緩存層來減少數據庫負載,但我們認爲將緩存層中需要存儲的實際數據最小化以進一步加速應用程序是一個好主意。使用臨時表是否明智?

所有數據庫中的產品,那就是遊客必須重視他們的代價可見:

價格都存儲在不同的表,稱爲prices。有多個價格類別取決於每個訪問者(客戶)適用的折扣級別。有時會有活動,這意味着每種產品都有特價。特殊價格存儲在名爲specials的表格中。

  • 將臨時表綁定在一起是不是很糟糕?

它只會有必要的信息,並且會被緩存。

-------------|-------------|------------ 
| productId | hasPrice | hasSpecial 
-------------|-------------|------------ 
    1   | 1   | 0 
    2   | 1   | 1 

通過這樣做,這將是超級容易知道具體的產品真正有價,而無需通過完整的pricesspecials表中的產品應該上市交易或者提出每一次迭代。

  • 臨時表是Web應用程序常見的東西還是它只是壞的設計?
+1

不是一個壞的理想。 SQL Server具有羣集索引視圖,Oracle具有物化視圖。他們實際上都在做你需要的東西。我很想知道MySQL是否有類似的結構,但我對此表示懷疑。 – 2010-04-29 12:32:01

+0

嗨列文。感謝您的意見。 – Industrial 2010-04-29 13:10:50

回答

1

您應該像處理其他任何性能問題一樣處理它:確定需要多少性能,然後在您的實驗室中對生產級硬件進行迭代測試。不要做不必要的優化。

你應該剖析你的應用並發現它是否做了太多的查詢或查詢本身很慢;即使查詢非常簡單,大多數Web應用程序緩慢的情況都是由於查詢過多(以我的經驗)。

通常情況下,最好的工程解決方案是重構數據庫,在某些情況下可以非規範化,以使常見的讀取用例需要更少的查詢。緩存也可能會有所幫助,但重構需要更少的查詢往往是最好的。

基本上,如果你打算做的比閱讀更多的閱讀,你可以增加寫路徑上的工作量以減少閱讀路徑的數量。

2

如果你打算緩存這些數據,它真的需要在臨時表中嗎?當您需要重建緩存時,只會產生查詢開銷,因此臨時表可能甚至不是必需的。

+0

寫入並保持緩存表更新的問題始終存在,但是再次,在加入與臨時表的產品時,第一個查詢會立即知道是否有興趣查看價格/特價表爲每個產品? – Industrial 2010-04-29 12:47:00

+1

@Industrial - 我想如果你有一張臨時表,那麼陳舊數據的問題可能會更糟,因爲你的緩存不僅可能陳舊,而且臨時表的內容也可能陳舊 - 尤其是如果更新的時間表他們沒有適當的計時。 – 2010-04-29 12:53:33

+0

嗯,是的。緩存失效一直是任何類型緩存的主要問題。它總是歸結爲緩存未命中和性能之間的折衷。 您是否認爲使用這種「臨時」表格還是不好的數據庫設計? – Industrial 2010-04-29 13:01:09