石建 | Fat Mind

          歪歪之數據庫

          題記:主要記錄同學分享的關于數據庫設計方面的內容,思考過一點,記錄下來。

          一、從需求開始,考慮數據庫的設計,且結合具體數據庫特性

            一個論壇,要求顯示帖子的總條數,對于mysql、innodb引擎;上線前期完全沒有問題,當人氣積累,帖子達到千萬級別時,此時性能的問題就會顯現出來。好的設計,是需求階段就要考慮的。對于我,這是一個思想概念上的轉變。
            但引擎如果換成myisam,就算數據達到億的級別,“統計總數”這樣的問題還會存在嗎 ?不會,myisam自身就會維護總數信息。因此設計,必須結合具體的數據庫的特性來做,不能以一概全。

          二、應該遵循原則 (未驗證)

            1.小結果集驅動大結果集。理由:mysql的連接查詢原理 ?
            2.盡可能在索引中完成排序。理由:索引本身就是有序的
            3.只取自己需要的column ?
            4.避免復雜的連接查詢和子查詢。
            5.適當的數據冗余.理由:帖子表&用戶表,如果帖子表擁有username,則每次帖子的顯示是不需要連接查詢獲取username。 
            6.應用層的cahce機制 ?

          三、概念

            1.垂直拆分:按列進行分割,即把一條記錄分開多個地方保存,每個子表的行數相同。帖子表,id、userid、username、content、xxx ...前面4個字段很常用,但是后面xxx等很多字段,不常用,數據量很大。進行垂直拆分,table1字段包含“id、userid、username、content”,table2包含“xxx、...”等不常用字段。優點:減少io的操作。缺點:如果需要不常用字段信息,需要連表查詢。
            2.水平拆分:
          按記錄進分分割,不同的記錄分開保存,每個子表的列數相同。比如:淘寶的用戶交易數據,根據用戶id取模,確定具體的數據存放在那個數據庫。水平拆分會給應用帶來復雜性。
            3.集群:提高系統的可用性。分庫的節點引入多臺機器,每臺機器保 存的數據是一樣,負載均衡在多臺機器。如何均衡、探測機器的可用性,是新的問題 ?
            4.主備:一般的互聯網應用中,經過一些數據調查得出結論,讀/寫的比例大概在 10:1左右。為什么要讀寫分離:寫操作涉及到鎖的問題,不管是行鎖還是表鎖還是塊鎖,在大并發的情況下,效率很低。寫操作集中在一個節點上,而讀操作其其他 的N個節點上進行。讀寫分離引入的新問題:比如我的Master上的數據怎樣和集群中其它Slave機器保持數據的同步和一致呢?




          posted on 2010-11-07 17:53 石建 | Fat Mind 閱讀(466) 評論(0)  編輯  收藏 所屬分類: database


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2010年11月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          What 、How、Why,從細節中尋找不斷的成長點
          主站蜘蛛池模板: 炉霍县| 安新县| 石阡县| 武陟县| 洞口县| 北安市| 夹江县| 高碑店市| 凌源市| 循化| 长春市| 信丰县| 双江| 五寨县| 义马市| 泌阳县| 那坡县| 太白县| 新竹市| 海晏县| 金阳县| 宜章县| 金门县| 顺义区| 南丹县| 界首市| 龙胜| 永定县| 兴文县| 稷山县| 晋宁县| 清徐县| 招远市| 罗甸县| 金塔县| 津市市| 靖远县| 旅游| 呼伦贝尔市| 阿瓦提县| 太湖县|