1. 程式人生 > >mysql(InnoDB)知識

mysql(InnoDB)知識

mysql(InnoDB)

1 資料庫ACID

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

2 事務的隔離級別

事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
不可重複讀(read-committed)預設
可重複讀(repeatable-read)
序列化(serializable)

  1、髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料
  2、不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。
  3、幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

3 事務的傳播行為

事務傳播行為型別 說明
PROPAGATION_REQUIRED(預設情況下) 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS 支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY 使用當前的事務,如果當前沒有事務,就丟擲異常。
PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER 以非事務方式執行,如果當前存在事務,則丟擲異常。
PROPAGATION_NESTED 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

4 資料庫鎖

  • 共享鎖(s鎖):共享鎖,多個事務共享一行資料,對其讀操作,防止其他事務來修改,對其加共享鎖。
  • 排他鎖(x鎖):互斥,當某個事務需要修改某一行,防止其他事務去訪問,對其加互斥鎖。
  • 意向鎖:一個事務對一行加鎖,另一個事務要對整個表加鎖,這時候會遍歷每一行是否加鎖,效率低下;引入意向鎖,在對某一行加鎖的時候,首先對整個表請求意向鎖,表示這個表中有資料正在加鎖,這時候一個事務對整個表加鎖,那麼首先看看意向鎖是否請求成功,如果不成功,表示有資料正在加鎖,這時候等待第一個事務完成後解除意向鎖和行級鎖,那麼這時候請求成功,對整個表加鎖

5 事務的實現原理

在開啟事務的時候,每個db操作記錄下來,如果提交那麼儲存到redo日誌中,回滾則是寫入undo日誌中(每個delete對應成一個insert,每個update對應一個反向update),所以當回滾的時候將對應的undo日誌寫一遍就好

6 儲存的物理結構和邏輯結構

  • .frm檔案:表的定義檔案
  • .idb檔案:表的資料檔案(資料、索引檔案)
    分成表空間、段、區、頁(存放一批行記錄)

7 資料型別及其區別

  • char:定長,最大255個字元
  • varchar:變長,最大65535個字元(既是單列的限制,又是整行的限制)
  • text:變長,有字符集的大物件,並根據字符集進行排序和校驗,大小寫不敏感
  • blob:變長,無字符集的二進位制大物件,大小寫敏感

7.1 varchar和char的區別

區別一:char不可變,varchar可變;varchar(20)表示20個字元,4.0以前指的是20個位元組

7.2 text和BLOB的區別

text存放字元文字(有字符集),blob存放二進位制檔案(可儲存圖片)

8 索引分類

  • 主鍵:是一種特殊的唯一索引,不允許有空值。
  • 唯一索引:索引列中的值必須是唯一的,但是允許為空值,
  • 普通索引:MySQL中基本索引型別,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹為了查詢資料更快一點。
  • 複合索引:在表中的多個欄位組合上建立的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用,使用組合索引時遵循最左字首集合。
  • 全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT型別欄位上使用全文索引

9 索引實現原理(B+樹)

9.1 B+樹:

  1. 有k個子結點的結點必然有k個關鍵碼
  2. 非葉結點僅具有索引作用,跟記錄有關的資訊均存放在葉結點中
  3. 樹的所有葉結點構成一個有序連結串列,可以按照關鍵碼排序的次序遍歷全部記錄

9.2 索引結構:

  • 聚集索引
    一個表只能有一個聚集索引:由主鍵所建成的B+樹構成
  • 非聚集索引(輔助索引)
    由每個索引建成的B+樹,葉子節點儲存的是記錄的聚集索引鍵,也就是說每次通過非聚集索引查詢相關記錄的時候是查詢兩個B+樹
    (有些引擎是非聚集索引直接儲存的是記錄的磁碟位置,這樣的話只需要查詢一個B+樹,但是記錄如果有修改,那麼會更新所有的相關聚集索引,
    但是如果存放聚集索引鍵,那麼只用更新聚集索引的B+樹)

9.3 複合索引實現原理

比如(列a,列b)的複合索引:
建造一個列A的B+樹,每個葉子節點存放所有的列a的資料,然後按照列b排序
例:按照年齡、姓、名字排序
三個索引圖
上述也解釋了複合索引為什麼是最左匹配原則

10 自適應雜湊

InnoDB儲存引擎自動建立一個雜湊表,自動根據訪問的頻率和模式來為某些頁建立雜湊索引。