關係型資料庫

不要必應發表於2019-08-30

關係型資料庫

1. 資料庫架構

資料庫架構

2. 索引

2.1 為什麼要使用索引

加快查詢速度,避免全表掃描

2.2 什麼樣的資料能使用索引

主鍵、唯一鍵和普通鍵

2.3 索引的資料結構

  • 二叉查詢樹
  • B-Tree
  • B+-Tree
  • Hash 結構

2.4 密集索引和稀疏索引的區別

  • 密集索引檔案中的每個搜尋碼都對應一個索引值
  • 稀疏索引檔案只為索引碼的某些值建立索引項

3. 鎖

3.1 InnoDB 與 MyISAM 在鎖方面的區別

  • MyISAM 只支援表級鎖,不支援行級鎖
  • InnoDB 預設使用行級鎖,也支援表級鎖

3.2 MyISAM 適用於:

  • 頻繁查詢 count
  • 查詢多,增刪改少
  • 不用事務

3.3 InnoDB 適用於:

  • 增刪改查都多的情況
    • 可靠性要求高

3.4 資料庫鎖的分類

  • 按鎖的粒度劃分:表級鎖、行級鎖和頁級鎖
  • 按鎖級別劃分:共享鎖和排它鎖
  • 按加鎖方式劃分:隱式鎖和顯示鎖
  • 按操作劃分:DML 鎖和 DDL 鎖
  • 按使用方式劃分:樂觀鎖和悲觀鎖

3.5 資料庫事務的四大特性:ACID

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 永續性(Durability)

ps: 資料庫的終極目標就是使資料庫從一個一致的狀態轉換到另一個一致的狀態,這就是ACID中的一致性,而原子性、隔離性、永續性是為了實現這個目標的手段。

3.6 事務隔離級別以及各級別下的併發訪問的問題

  • 更新丟失:MySQL 所有事務隔離級別在資料庫層面上均可避免
  • 髒讀:READ-COMMIT 事務隔離級別以上可避免
  • 不可重複讀:REPEATABLE-READ
  • 幻讀:SERIALIZABLE
    檢視 MySQL8.x 事務隔離級別
    show variables like 'transaction_isolation'
    
    臨時設定當前 Session 的事務隔離
    set session transaction isolation level read uncommitted;
複製程式碼

3.7 InnoDB 可重複讀隔離級別下如何避免幻讀

  • 表象:快照讀(非阻塞讀)—— 偽 MVCC
  • 內在:next-key 鎖(行鎖 + gap鎖)

3.7.1 RC 級別下的 InnoDB 的非阻塞讀如何實現

  • 資料行裡的 DB_TRX_ID、DB_ROLL_PTR 和 DB_ROW_ID

    • DB_TRX_ID:最後一次對該行資料插入或刪除的事務 ID
    • DB_ROLL_PTR:回滾指標
    • DB_ROW_ID:如果表中不存主鍵 或者 唯一索引,那麼資料庫 就會採用DB_ROW_ID生成聚簇索引。否則DB_ROW_ID不會出現在索引中。
  • undo 日誌

    • insert undo log:插入時的 log,在 commit 之後被丟棄
    • update undo log:修改和刪除時的 log,在快照讀時會使用

    DB_ROLL_PTR

  • read view

3.7.2 RR 級別下的 InnoDB 的非阻塞讀如何實現

  • 行鎖
  • Gap 鎖:where 條件全部命中,不會使用 Gap 鎖,部分與全不命中就會加

4. 正規化

相關文章