mysql(InnoDB)知識
阿新 • • 發佈:2019-01-11
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+樹:
- 有k個子結點的結點必然有k個關鍵碼
- 非葉結點僅具有索引作用,跟記錄有關的資訊均存放在葉結點中
- 樹的所有葉結點構成一個有序連結串列,可以按照關鍵碼排序的次序遍歷全部記錄
9.2 索引結構:
- 聚集索引
一個表只能有一個聚集索引:由主鍵所建成的B+樹構成 - 非聚集索引(輔助索引)
由每個索引建成的B+樹,葉子節點儲存的是記錄的聚集索引鍵,也就是說每次通過非聚集索引查詢相關記錄的時候是查詢兩個B+樹
(有些引擎是非聚集索引直接儲存的是記錄的磁碟位置,這樣的話只需要查詢一個B+樹,但是記錄如果有修改,那麼會更新所有的相關聚集索引,
但是如果存放聚集索引鍵,那麼只用更新聚集索引的B+樹)
9.3 複合索引實現原理
比如(列a,列b)的複合索引:
建造一個列A的B+樹,每個葉子節點存放所有的列a的資料,然後按照列b排序
例:按照年齡、姓、名字排序
上述也解釋了複合索引為什麼是最左匹配原則
10 自適應雜湊
InnoDB儲存引擎自動建立一個雜湊表,自動根據訪問的頻率和模式來為某些頁建立雜湊索引。