#phalapi-進階篇6(解決大量數據存儲數據庫分表分庫拓展)#

##前言##
時隔半個月隨著PHP7的推出為PHP打了一瓶興奮劑,在性能提升了一倍的情況下我們會逐漸發現,瓶頸會集中在數據庫操作,那我們的內容就接著數據庫讀寫分離,來聊聊分表分庫應該怎么玩,因為PhalApi的分表分庫并不是非常方便,筆者在這里提供了一個分表分庫數據庫集群的拓展,詳細文檔請見博客**基于PhalApi的DB集群拓展 V0.1bate**
大家可以自行在**開源中國擴展Git地址**中找到**Cluster**進行下載使用.
***先在這里感謝phalapi框架創始人@dogstar,為我們提供了這樣一個優秀的開源框架.***
附上:
喵了個咪的博客:[w-blog.cn](w-blog.cn)
官網地址:[http://www.phalapi.net/](http://www.phalapi.net/ "PhalApi官網")
開源中國Git地址:[http://git.oschina.net/dogstar/PhalApi/tree/release](http://git.oschina.net/dogstar/PhalApi/tree/release "開源中國Git地址")
開源中國擴展Git地址:[http://git.oschina.net/dogstar/PhalApi-Library](http://git.oschina.net/dogstar/PhalApi-Library"開源中國擴展Git地址")
##1. 場景##
在實際工作中,我信奉一句話**一切拋開業務的架構設計都是耍流氓**所以我們從場景進行開篇
###1.1 單條數據多查多寫多改###
這里做的例子,大家都在玩游戲把,玩游戲里面是不是有角色,角色是不是有裝備,經驗,物品以及等等,而且他會有一個特別的要求就是實時(因為我角色打了一個怪物獲得了100xp我們不可能告訴他你等6個小時緩存時間結束了再來看,必須是實時的),當然我們可以使用緩存來解決這個問題我們下節會說到這個問題
那么在這種場景下,一個用戶對于角色的操作非常頻繁而且唯一我們就很好采用分表分庫的操作了,相對于單表操作他會把所有的操作分散到各個數據庫去操作,這樣對于單個數據庫總執行sql語句量就會有個指數級的下降,以及數據量也會均衡分配到每個數據庫,但是當我們進行這類單條數據操作的時候根本不會對性能有任何的影響,因為只是通過算法得出了這條記錄存在于那個庫那張表而已,
###1.2 日志記錄分析###
就已上面的例子我們繼續講,如果有一天你的領導過來提了個需求,我需要一個數據分析系統來統計用戶每天什么時間段最活躍.用戶平均每人充值了多少錢啊,多少等級下用戶充錢最多啊,如果遇到這種問題你們會怎么辦?三分鐘思考
我們先來看看我們會遇到什么樣子的問題,數據量大積累當1000w+之后數據庫執行sql基本沒法看,大量的寫入數據對數據庫壓力大
我們再來看看分表分庫怎么解決這個問題,1000w+數據庫的情況下 比如你是4表4庫一共16張表,那每張表的數量就是1000w/16=62w也就是每張表只需要存儲62w的數據就ok了,當寫入數據的時候會根據ID的順序均衡寫入4庫執行sql的壓力也就分布到了4個數據庫,唯一的問題就是在執行where條件的時候可能需要對前置表進行遍歷,而前置表的數據量就是1000w,當然前置表里面只存放ID和where條件的字段
##2. 實現思路##
就筆者在工作中接觸到了很多案例的分表分庫,使用了根據城市,或者是其他的特性進行分表分庫規則,這樣一定會出現用戶分布不均勻導致的某一個庫表壓力巨大,我這里使用了均等分分割
大家先看一組圖就會明白了

1. 當我們進行插入的時候的操作如下:
插入前置表獲取主鍵,通過id得出應該存入幾庫幾表在相應的地方寫入數據
2. 當我們進行單條讀取操作的時候操作如下:
通過id獲取應該在幾庫幾表在相應的地方獲取數據
3. 當我們使用where查詢的時候操作如下:
如果where條件在前置表存在從前置表通過where獲取結果集ID,通過ID分組到庫和表,然后進行查詢在拼接結果集統一返回
##3. 優缺點##
1. 優點:
很好的避開了數據庫存放數據過多效率底下的瓶頸
在單條記錄操作性能指數及提升
數據量大的情況下where條件查詢性能提高基本
能對億級的數據進行處理而且效率較高
不需要考慮分表分庫規則數據均等分布
2. 缺點
where查詢字段必須預先添加到,前置表不然就必須遍歷數據庫數量 * 表數量才能得到想要的結果
where查詢就算有前置表的情況下最壞的情況也需要遍歷數據庫數量 * 表數量才能得到想要的結果
對一些特定查詢天生不足比如排序
##4. 總結##
在本小節的最好簡單提及一下,**基于PhalApi的DB集群拓展 V0.1bate**功能展示比較局限童鞋們可以根據自己的業務需求來覺得是否使用,筆者也會在后期繼續更新維護完善為一個比較方便的集群拓展.
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!
**官網QQ交流群:421032344 歡迎大家的加入!**
####[上一章](/wikis/%5b7.11%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%875(%e6%95%b0%e6%8d%ae%e5%ba%93%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb).html) [文檔首頁](/wikis/) [下一章](/wikis/%5b7.13%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%877(%e4%bd%bf%e7%94%a8%e7%bc%93%e5%ad%98%e4%bb%a5%e5%8f%8a%e7%94%a8redis%e6%8b%93%e5%b1%95%e8%a7%a3%e5%86%b3%e5%ae%9e%e9%99%85%e9%97%ae%e9%a2%98).html)
- 空白目錄
- [7.1]-phalapi-入門篇1(簡單介紹以及環境搭建)
- [7.2]-phalapi-入門篇2(把它玩起來)
- [7.3]-phalapi-入門篇3(請求和返回)
- [7.4]-phalapi-入門篇4(國際化高可用和自動生成文檔)
- [7.5]-phalapi-入門篇5(數據庫操作和Model層)
- [7.6]-phalapi-入門篇6(小技巧和淺談API適用范圍以及入門篇總結)
- [7.7]-phalapi-進階篇1(三層結構Api,Domain,和Model)
- [7.8]-phalapi-進階篇2(DI依賴注入和單例模式)
- [7.9]-phalapi-進階篇3(自動加載和攔截器)
- [7.10]-phalapi-進階篇4(notorm進階以及事務操作)
- [7.11]-phalapi-進階篇5(數據庫讀寫分離)
- [7.12]-phalapi-進階篇6(解決大量數據存儲數據庫分表分庫拓展)
- [7.13]-phalapi-進階篇7(使用緩存以及用redis拓展解決實際問題)
- [7.14]-phalapi-進階篇8(PhalApi能帶來什么和進階篇總結)