System Design 關係型資料庫的擴充套件 - 學習筆記
引用:
系統設計入門
主從複製
主庫同時負責讀取和寫入操作,並複製寫入到一個或多個從庫中,從庫只負責讀操作。
樹狀形式的從庫再將寫入複製到更多的從庫中去。如果主庫離線,系統可以以只讀模式執行,直到某個從庫被提升為主庫或有新的主庫出現。
缺點:
- 將從庫提升為主庫需要額外的邏輯。
主主複製
兩個主庫都負責讀操作和寫操作,寫入操作時互相協調。如果其中一個主庫掛機,系統可以繼續讀取和寫入。
缺點:
- 你需要新增負載均衡器或者在應用邏輯中做改動,來確定寫入哪一個資料庫。
- 多數主-主系統要麼不能保證一致性(違反 ACID),要麼因為同步產生了寫入延遲。
- 隨著更多寫入節點的加入和延遲的提高,如何解決衝突顯得越發重要。
主從複製和主主複製共同的問題
- 如果主庫在將新寫入的資料複製到其他節點前掛掉,則有資料丟失的可能。
- 副本可能因為過多寫操作阻塞住,導致讀取功能異常。
- 讀取從庫越多,需要複製的寫入資料就越多,導致更嚴重的複製延遲。
- 在某些資料庫系統中,寫入主庫的操作可以用多個執行緒並行寫入,但讀取副本只支援單執行緒順序地寫入。
- 複製意味著更多的硬體和額外的複雜度。
聯合
聯合(或按功能劃分)將資料庫按對應功能分割。
例如,你可以有三個資料庫:論壇、使用者和產品,而不僅是一個單體資料庫,從而減少每個資料庫的讀取和寫入流量,減少複製延遲。
較小的資料庫意味著更多適合放入記憶體的資料,進而意味著更高的快取命中機率。沒有隻能序列寫入的中心化主庫,你可以並行寫入,提高負載能力。
缺點:
- 如果你的資料庫模式需要大量的功能和資料表,聯合的效率並不好。
- 你需要更新應用程式的邏輯來確定要讀取和寫入哪個資料庫。
- 從兩個庫聯結資料更復雜。
- 聯合需要更多的硬體和額外的複雜度。
分片
分片將資料分配在不同的資料庫上,使得每個資料庫僅管理整個資料集的一個子集。
以使用者資料庫為例,隨著使用者數量的增加,越來越多的分片會被新增到叢集中。
類似聯合的優點,分片可以減少讀取和寫入流量,減少複製並提高快取命中率。也減少了索引,通常意味著查詢更快,效能更好。如果一個分片出問題,其他的仍能執行,你可以使用某種形式的冗餘來防止資料丟失。類似聯合,沒有隻能序列寫入的中心化主庫,你可以並行寫入,提高負載能力。
常見的做法是使用者姓氏的首字母或者使用者的地理位置來分隔使用者表。
缺點:
- 你需要修改應用程式的邏輯來實現分片,這會帶來複雜的 SQL 查詢。
- 分片不合理可能導致資料負載不均衡。例如,被頻繁訪問的使用者資料會導致其所在分片的負載相對其他分片高。
- 再平衡會引入額外的複雜度。基於一致性雜湊的分片演算法可以減少這種情況。
- 聯結多個分片的資料操作更復雜。
- 分片需要更多的硬體和額外的複雜度。
非規範化
非規範化試圖以寫入效能為代價來換取讀取效能。在多個表中冗餘資料副本,以避免高成本的聯結操作。
在多數系統中,讀取操作的頻率遠高於寫入操作,比例可達到 100:1,甚至 1000:1。需要複雜的資料庫聯結的讀取操作成本非常高,在磁碟操作上消耗了大量時間。
SQL調優
參見 MySQL 效能優化學習筆記
參見 MySQL 索引學習筆記
相關文章
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- GBASE觀察:擴充套件分析型資料庫套件資料庫
- 記錄一些有關資料庫操作的擴充套件包資料庫套件
- java資料型別擴充套件Java資料型別套件
- ES6學習筆記4--字串的擴充套件筆記字串套件
- C#學習筆記-方法引數、擴充套件方法C#筆記套件
- 擴充套件中國剩餘定理(EXCRT)學習筆記套件筆記
- 關係型資料庫和非關係型資料庫的區別資料庫
- 關係型資料庫與非關係型資料庫介紹!資料庫
- 關係型資料庫資料庫
- 資料庫擴充套件表設計過程記錄資料庫套件
- sql中的擴充套件學習SQL套件
- ES6各大資料型別的擴充套件大資料資料型別套件
- 關係型資料庫概要資料庫
- 關係型資料庫原理資料庫
- 一起學習PHP中的Tidy擴充套件庫PHP套件
- 資料庫學習筆記資料庫筆記
- PHP的SPL擴充套件庫(一)資料結構PHP套件資料結構
- 非關係型資料庫(NOSQL)和關係型資料庫(SQL)區別詳解資料庫SQL
- 關係型資料庫之SQL資料庫SQL
- 關係型資料庫之索引資料庫索引
- redis—非關係型資料庫Redis資料庫
- System Design 學習路徑
- PHP的命令列擴充套件Readline相關函式學習PHP命令列套件函式
- 數論學習筆記 (4):擴充套件歐幾里得演算法筆記套件演算法
- 練習安裝Python擴充套件庫Python套件
- SpringCloudGateway資料庫儲存路由資訊的擴充套件方案SpringGCCloudGateway資料庫路由套件
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- 使用nub恢復資料庫的知識擴充套件資料庫套件
- 1029學習筆記 資料庫筆記資料庫
- python學習筆記:資料庫Python筆記資料庫
- MySQL資料庫學習筆記MySql資料庫筆記
- Minecraft中BossBar、Recipe的底層實現與擴充套件應用(學習筆記)Raft套件筆記
- 並推出了關係型資料庫功能來補充其核心NoSQL資料庫功能資料庫SQL
- 大資料——Scala擴充套件大資料套件
- Laravel深入學習7 – 框架的擴充套件Laravel框架套件
- 數值的擴充套件方法以及新增資料型別BigInt套件資料型別
- Python 學習筆記——資料型別Python筆記資料型別