3

我目前正在嘗試改進Web應用程序的性能。該應用程序的目標是提供(real time) analytics。我們有一個類似於star schema的數據庫模型,很少有事實表和許多維表。該數據庫正在運行MysqlMyIsam引擎。
事實表的大小可以很容易地進入上百萬,一些維度表也可以達到數百萬。
現在重點是,如果維度表連接到事實表上並且也完成了聚合,那麼select查詢會非常慢。聽到這個時首先想到的是,爲什麼不預先計算數據?這是不可能的,因爲用戶可以使用幾個可自由定製的過濾器。混合列和行數據庫?

所以我需要的是一個適用於各種目的的一體化系統;)可悲的是它還沒有發明出來。所以我想到了結合兩個現有系統的想法。混合row orientedcolumn oriented數據庫(例如像infinidbinfobright)。保存mysql MyIsam解決方案(用於快速插入和基於行的查詢)並向列中添加一個列式數據庫(用於在少數列上進行快速聚合操作)並通過cronjob定期(夜間)填充它。問題是當前的數據(它必須是實時的)被查詢時,因此我可能需要從兩個數據庫中獲取數據,這可能會使事情複雜化。

首先使用infinidb進行的測試表明,在聚合幾列時表現出非常好的性能,所以我真的認爲這可以幫助我加快應用程序的速度。

所以問題是,這是一個好主意嗎?有人可能已經做到了這一點?也許有更好的方法來做到這一點。

我對面向列的數據庫還沒有經驗,我也不確定它的模式應該如何。第一次測試在相同的star schema like結構上表現出良好的性能,但也在big table like結構中表現出良好的性能。

我希望這個問題適合於SO。

+0

只需將您的引擎更改爲innodb http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html。我可能會將數據導出到按主鍵排序的csv文件中,使用innodb重新創建模式,然後重新加載排序後的數據。 – 2011-02-25 11:31:24

+0

謝謝,是的,我們也在考慮更改爲innodb,尤其是因爲大規模並行讀取/寫入。我還用innodb測試了一下,它給出了很好的結果,特別是在併發讀/寫時。但並不是真正需要的性能提升,就像面向列的數據庫一樣,這些數據庫在某些操作上的性能提高了約25%以上。 – enricog 2011-02-25 11:49:13

+0

奇怪 - 我觀察到完全相反 - 也許你需要重新設計你的模式,以利用innodb的聚簇索引http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-索引優化/ – 2011-02-25 11:57:10

回答

3

Greenplum是PostgreSQL專有的(但大部分是免費的)啤酒擴展,支持列定向和行定向壓縮。此外,如果您希望某些部分會經歷繁重的事務負載,而其他部分則不會,您可以在同一個表內混合設置。例如,最近的一年可以是面向行和未壓縮的,前一年是以列爲導向並且快速編譯的,以及所有歷史年份是以列爲導向和bz2壓縮的。如果您需要通過其MPP功能(這是它的主要賣點)進行擴展,那麼確實需要花費大量資金,因爲它們針對的是大型企業客戶。

(聲明:我已經經歷了Greenplum的專業,但只有在評估他們的軟件購買的情況下)。

至於如何設置架構的問題,很難說太多,而不知道你的數據的細節,但通常有壓縮的列嚮導表應該讓你對模式設計的所有直覺走出窗口。

特別是,規範化幾乎是不值得的努力,有時你可以通過非規範化到臨界 - 滑稽的冗餘級別來獲得巨大的性能提升。如果數據從未以未壓縮狀態訪問磁盤,那麼您可能不在乎是否重複每個客戶的名稱40,000次。 Infobright的壓縮算法是專門爲這類應用程序設計的,並且在表格的邏輯和物理大小之間以40比1的比例結束並不罕見。