如何設計一個關係型數據庫?
- 首先要設計數據庫至少需要兩大部分:一個存放數據的倉庫,那就是硬盤。還有就是管理和控制數據的部分,也就是我們說的數據庫系統。
- 主要來說明第二部分數據庫系統至少包含了哪些模塊。才能被稱爲數據庫。
數據庫系統
- 存儲管理:統一文件格式,管理存儲和插入等。
- 緩存機制:如果每次獲取都要涉及到I/O操作,那麼效率是非常差的,我們可以模仿硬盤的做法,如果獲取到某一條數據,那麼將相鄰的數據部分一同加入內存中。等待下次獲取如果命中內存中的數據就避免了I/O操作。
- sql解析:我們可以採用sql語句來支持我們的數據庫CRUD操作。那麼我們就需要一套可以用來解析的sql語句。
- 日誌管理:有了sql語句後,我們需要監聽每一條sql的執行記錄,什麼時候操作的,動了哪些數據,以及數據庫的錯誤等。
- 權限管理:對於安全起見,不能讓所有人都可以查詢或刪除每條記錄,既加入權限管理。
- 容災機制:爲了防止數據庫宕機不能進行正常操作,所以加入容災機制,如果數據庫宕機了,就嘗試修復正常。如果修復失敗,也可以做一些避免數據丟失的操作,或者可以通知管理員等後續辦法。
- 鎖管理:爲了防止高併發,出現的數據錯誤,並加入鎖管理。這一模塊在數據庫中也是重中之重。
- 索引模塊:在大量的數據下,使用索引模塊能夠提高讀取效率。當然在數據較少的情況下,推薦不加索引。
索引部分
索引是幫助 數據庫高效獲取數據的數據結構。
索引的出現靈感來自於字典上,它用關鍵詞來表示對應數據相關的信息,就好比字典,我們通過一個首字母就能快速的找到對應的字,這樣就避免了一頁頁的查找。在回到索引這裏,每次查找數據都需要對硬盤進行I/O操作,就是是固態硬盤在大量的數據下查詢效率也是非常慢的。爲了突破I/O效率的瓶頸,故就有了索引。
什麼樣的信息能成爲索引?
上面介紹到什麼是索引,那麼在數據庫中,主鍵、唯一鍵、普通鍵都可以成爲索引。
索引的數據結構
索引既然能夠快速的查找出數據,那麼是通過怎樣的數據結構來快速查詢的,索引的數據結構分爲以下幾種:
- 使用平衡二叉樹進行二分查找
- 使用B-Tree(B樹)結構進行查找
- 使用B±Three(B+樹)結構進行查找
平衡二叉樹結構
平衡二叉樹是基於二分法的策略提高數據的查找速度的二叉樹的數據結構,它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
查找方式
通過根節點來判斷在哪邊查找,如果小於則一定是在左邊,如果大於則一定是在右邊。
B-Tree樹
1970年,R.Bayer和E.mccreight提出了一種適用於外查找的樹,它是一種平衡的多叉樹,稱爲B樹。
一棵m階的B樹滿足下列條件:
- 樹中每個結點至少有2個孩子
- 除根結點和葉子結點外,其它每個結點至少有m/2(如果爲小數則向上轉整)個孩子
- 每個結點最多含有m個孩子(m>=2)
- 所有葉子節點都位於同一層
- 所有的葉子節點的順序必須是從小到大排序的
- 關鍵數的個數必須是葉子的個數-1
- 非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;
查找方式
從根節點開始,判斷該關鍵詞是走哪個子結點,如上圖所示,如果該關鍵詞小於17那麼應該走第一個子節點,如果是在17-35之間的,那麼應該走第二個子節點,如果大於35的,就應該走第三個子節點。直到找到對應的葉子節點爲止。
B+ -Three(B+樹)
B+樹是B樹的變體,B+ 樹的特點是能夠保持數據穩定有序,其插入與修改擁有較穩定的對數時間複雜度。每個節點通常有多個孩子,一顆B+樹包含根節點、內部節點和葉子節點。
B+樹基礎了B樹的基本特徵基本相同,但是有一點小變化:
- 有n棵子樹的結點中含有n個關鍵字 (結點有多少個,那麼關鍵字也要多少個)
- 非葉子節點僅用來索引,數據都保存在葉子節點中
- 所有的葉子節點均有一個鏈指向下一個葉子節點
密集索引和稀疏索引的區別
密集索引
密集索引的每個記錄都有一個索引項,記錄在數據區存放是任意的,但索引是按序的,這種索引稱爲稠密索引。這類文件的索引查找、更新都較方便,但由於索引項多,佔用空間較大。
稀疏索引
稀疏索引是將所有數據記錄關鍵字值分成許多組,每組一個索引項,組之間是有順序排列的。稀疏索引往往是佔用空間小,並且插入和刪除時所需的維護開銷也小。
區別:
- 密集索引查找速度快,但是空間佔用大
- 稀疏索引查找效率低,但是空間佔用小,且插入和刪除開銷也小
innoDB在主鍵索引的關係
- 若一個主鍵被定義,則該主鍵是密集索引
- 若沒有主鍵被定義,則第一個唯一非空索引則爲密集索引
- 若不滿足以上條件,innoDB會創建一個隱藏主鍵(密集索引)
- 非主鍵索引存儲相關鍵位和其對相應的主鍵值,包含兩次查找