MySQL中隻存儲需要查詢的小字段,NoSQL存儲所有數據。
//寫入數據的示例偽代碼
//data為我們要存儲的數據對象
data.title=”title”;
data.name=”name”;
data.time=”2009-12-01 10:10:01”;
data.from=”1”;
bool status=false;
DB.startTransaction();//開始事務
id=DB.Insert(“INSERT INTO table (from) VALUES(data.from)”);//寫入MySQL數據庫,隻寫from需要where查詢的字段
if(id>0){
status=NoSQL.Add(id,data);//以寫入MySQL產生的自增id為主鍵寫入NoSQL數據庫
}
if(id>0 && status==true){
DB.commit();//提交事務
}else{
DB.rollback();//不成功,進行回滾
}
把需要查詢的字段,一般都是數字,時間等類型的小字段存儲於MySQL中,根據查詢建立相應的索引,其他不需要的字段,包括大文本字段都存儲在NoSQL中。在查詢的時候,我們先從MySQL中查詢出數據的主鍵,然後從NoSQL中直接取出對應的數據即可。
這種架構模式把MySQL和NoSQL的作用進行了融合,各司其職,讓MySQL專門負責處理擅長的關係存儲,NoSQL作為數據的存儲。它有以下優點:
· 節省MySQL的IO開銷。由於MySQL隻存儲需要查詢的小字段,不再負責存儲大文本字段,這樣就可以節省MySQL存儲的空間開銷,從而節省MySQL的磁盤IO。我們曾經通過這種優化,把MySQL一個40G的表縮減到幾百M。
· 提高MySQl Query Cache緩存命中率。我們知道query cache緩存失效是表級的,在MySQL表一旦被更新就會失效,經過這種字段的分離,更新的字段如果不是存儲在MySQL中,那麼對query cache就冇有任何影響。而NoSQL的Cache往往都是行級彆的,隻對更新的記錄的緩存失效。
· 提升MySQL主從同步效率。由於MySQL存儲空間的減小,同步的數據記錄也減小了,而部分數據的更新落在NoSQL而不是MySQL,這樣也減少了MySQL數據需要同步的次數。
· 提高MySQL數據備份和恢複的速度。由於MySQL數據庫存儲的數據的減小,很容易看到數據備份和恢複的速度也將極大的提高。
· 比以前更容易擴展。NoSQL天生就容易擴展。經過這種優化,MySQL性能也得到提高。
比如手機鳳凰網就是這種架構 http://www.cnblogs.com/sunli/archive/2010/12/20/imcp.html
以NoSQL為輔的架構還是以MySQL架構的思想為中心,隻是在以前的架構上輔助增加了NoSQL來提高其性能和可擴展性。這種架構實現起來比較 容易,卻能取得不錯的效果。如果正想在項目中引入NoSQL,或者你的以MySQL架構的係統目前正出現相關的瓶頸,希望本文可以為你帶來幫助。