我目前正在嘗試改進Web應用程序的性能。該應用程序的目標是提供(real time) analytics
。我們有一個類似於star schema
的數據庫模型,很少有事實表和許多維表。該數據庫正在運行Mysql
和MyIsam
引擎。
事實表的大小可以很容易地進入上百萬,一些維度表也可以達到數百萬。
現在重點是,如果維度表連接到事實表上並且也完成了聚合,那麼select查詢會非常慢。聽到這個時首先想到的是,爲什麼不預先計算數據?這是不可能的,因爲用戶可以使用幾個可自由定製的過濾器。混合列和行數據庫?
所以我需要的是一個適用於各種目的的一體化系統;)可悲的是它還沒有發明出來。所以我想到了結合兩個現有系統的想法。混合row oriented
和column oriented
數據庫(例如像infinidb
或infobright
)。保存mysql MyIsam解決方案(用於快速插入和基於行的查詢)並向列中添加一個列式數據庫(用於在少數列上進行快速聚合操作)並通過cronjob定期(夜間)填充它。問題是當前的數據(它必須是實時的)被查詢時,因此我可能需要從兩個數據庫中獲取數據,這可能會使事情複雜化。
首先使用infinidb進行的測試表明,在聚合幾列時表現出非常好的性能,所以我真的認爲這可以幫助我加快應用程序的速度。
所以問題是,這是一個好主意嗎?有人可能已經做到了這一點?也許有更好的方法來做到這一點。
我對面向列的數據庫還沒有經驗,我也不確定它的模式應該如何。第一次測試在相同的star schema like
結構上表現出良好的性能,但也在big table like
結構中表現出良好的性能。
我希望這個問題適合於SO。
只需將您的引擎更改爲innodb http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html。我可能會將數據導出到按主鍵排序的csv文件中,使用innodb重新創建模式,然後重新加載排序後的數據。 – 2011-02-25 11:31:24
謝謝,是的,我們也在考慮更改爲innodb,尤其是因爲大規模並行讀取/寫入。我還用innodb測試了一下,它給出了很好的結果,特別是在併發讀/寫時。但並不是真正需要的性能提升,就像面向列的數據庫一樣,這些數據庫在某些操作上的性能提高了約25%以上。 – enricog 2011-02-25 11:49:13
奇怪 - 我觀察到完全相反 - 也許你需要重新設計你的模式,以利用innodb的聚簇索引http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-索引優化/ – 2011-02-25 11:57:10