本章,將介紹資料庫架構設計中的一些基本概念,常見問題以及對應解決方案,為了便於讀者理解,將以「使用者中心」為例,講解資料庫架構設計的常見玩法。
使用者中心是乙個非常常見的業務,主要提供使用者註冊、登入、資訊查詢與修改的服務,其核心元資料為:
user(uid, uname, passwd, ***, age, nickname, …)
其中:資料庫設計上,一般來說在業務初期,單庫單錶就能夠搞定這個需求。
最常見的架構設計如上:
什麼是分組?
答:分組架構是最常見的一主多從,主從同步,讀寫分離資料庫架構:
主和從構成的資料庫集群稱為「組」。
分組有什麼特點?
答:同乙個組裡的資料庫集群:
分組架構究竟解決什麼問題?
答:大部分網際網路業務讀多寫少,資料庫的讀往往最先成為效能瓶頸,如果希望:
此時可以使用分組架構,需要注意的是,分組架構中,資料庫的主庫依然是寫單點。
一句話總結,分組解決的是「資料庫讀寫高併發量高」問題,所實施的架構設計。
什麼是分片?
答:分片架構是大夥常說的水平切分(sharding)資料庫架構:
分片後,多個資料庫例項也會構成乙個資料庫集群。
水平切分,到底是分庫還是分表?
答:強烈建議分庫,而不是分表來實施水平切分,因為:
水平切分,用什麼演算法?
答:常見的水平切分演算法有「範圍法」和「雜湊法」:
範圍法如上圖:以使用者中心的業務主鍵uid為劃分依據,將資料水平切分到兩個資料庫例項上去:
雜湊法如上圖:也是以使用者中心的業務主鍵uid為劃分依據,將資料水平切分到兩個資料庫例項上去:
這兩種方法在網際網路都有使用,其中雜湊法使用較為廣泛。
分片有什麼特點?
答:同乙個分片裡的資料庫集群:
分片架構究竟解決什麼問題?
答:大部分網際網路業務資料量很大,單庫容量容易成為瓶頸,此時通過分片可以:
一句話總結,分片解決的是「資料庫資料量大」問題,所實施的架構設計。
如果業務讀寫併發量很高,資料量也很大,通常需要實施分組+分片的資料庫架構:
除了水平切分,垂直切分也是一類常見的資料庫架構設計,垂直切分一般和業務結合比較緊密。
還是以使用者中心為例,可以這麼進行垂直切分:
user(uid, uname, passwd, ***, age, …)
user_ex(uid, intro, sign, …)
如何進行垂直切分?
答:根據業務對資料進行垂直切分時,一般要考慮屬性的「長度」和「訪問頻度」兩個因素:
這是因為,資料庫會以行(row)為單位,將數load到記憶體(buffer)裡,在記憶體容量有限的情況下,長度短且訪問頻度高的屬性,記憶體能夠load更多的資料,命中率會更高,磁碟io會減少,資料庫的效能會提公升。
垂直切分有什麼特點?
答:垂直切分和水平切有相似的地方,又不太相同:
垂直切分解決什麼問題?
答:垂直切分即可以降低單庫的資料量,還可以降低磁碟io從而提公升吞吐量,但它與業務結合比較緊密,並不是所有業務都能夠進行垂直切分的。
業務場景決定資料庫架構:
還有哪些未盡事宜?
本文以「使用者中心」為例,對常見資料庫架構設計進行了簡要梳理與總結,但實際資料庫架構設計遠比此複雜,特別是水平切分的架構設計,不同業務場景的切分方式不盡相同。
本專題後續將要詳細介紹,覆蓋90%網際網路業務特性的四類業務:
分別應該如何實施水平切分,專題期望達到的效果是,從今之後,不管什麼業務場景,資料量大水平切分的技術問題從此就不用再擔心了,盡請期待。
資料庫典型題目
工廠 工廠編號,廠名,位址 主碼是工廠編號 職工 工號,姓名,工廠編號,聘期,工資 主碼是工號,外碼是工廠編號 產品 產品編號,產品名,規格 主碼是產品編號 生產關係 產品編號,工廠編號,計畫數量 主碼是 產品編號,工廠編號 外碼是產品編號 工廠編號 select a anmae from a wh...
mySQLite資料庫使用前言
方法例項中資料庫鍵值分別為 0 id,1 title,2 price,3 image,4 goodsid,5 number 其中id為主鍵,goodsid為商品編號veriable代表變數,count代表計數,其中column方法中的count代表對應鍵值在資料庫中的位置,從0開始 而bind方法中...
高階資料庫典型技術
資料庫作為計算機學科中乙個比較重要的分支,也是乙個對於程式設計師來說非常好的學習方向。平時我們用的最多的,同時也是接觸最多的一定是增刪改查語句,select,update,delete等,當然,我不會拿這些再說一遍,這些都是老的掉渣的東西了。所以我們可以學習高階資料庫中所以涉及的技術。換句話,其實就...