InnoDB的索引,鎖,事務

索引

InnoDB索引就是分爲聚簇索引和非聚簇索引,所有的非聚簇索引就是輔助索引。它們之間的最大區別就是,聚集索引中存放着一條行記錄的全部信息,而輔助索引中只包含索引列和一個用於查找對應行記錄的『書籤』。下面面我們詳細解釋一下

聚簇索引

InnoDB 存儲引擎中的表都是使用索引組織的,也就是按照鍵的順序存放;聚集索引就是按照表中主鍵的順序構建一顆 B+ 樹,並在葉節點中存放表中的行記錄數據
在這裏插入圖片描述
聚集索引與表的物理存儲方式有着非常密切的關係,所有正常的表應該有且僅有一個聚集索引(絕大多數情況下都是主鍵),表中的所有行記錄數據都是按照聚集索引的順序存放的。

當我們使用聚集索引對錶中的數據進行檢索時,可以直接獲得聚集索引所對應的整條行記錄數據所在的頁,不需要進行第二次操作。

輔助索引

一張表一定包含一個聚集索引構成的 B+ 樹以及若干輔助索引的構成的 B+ 樹。在這裏插入圖片描述
如果按照輔助索引查找一條記錄,自己能按照輔助索引先查找出書籤,再去聚簇索引中查找這一行的記錄
,所以可能需要查找兩次

InnoDB協議-MVCC(多版本的併發控制協議)

讀不加鎖,讀寫不衝突

讀一般分爲:快照讀;當前讀
快照讀:記錄的可見版本
當前讀:記錄的最新版本

快照度一般就是簡單的select語句
當前讀就是特殊的讀操作,插入更新刪除。

既然說到了鎖,我們就簡單介紹一下

我們都知道鎖的種類一般分爲樂觀鎖和悲觀鎖兩種,InnoDB 存儲引擎中使用的就是悲觀鎖,而按照鎖的粒度劃分,也可以分成行鎖和表鎖。我們都知道InnoDB實現的是行鎖,樂觀鎖就是一種思想,並不是真正意義上的鎖,我們這裏不做過多的解釋,主要以InnoDB爲主。

鎖的種類

在數據庫中的操作也就是兩種,讀操作和寫操作,而數據庫實現鎖時,因爲主要是對這兩種操作加鎖,也就是共享鎖和互斥鎖(排他鎖)
共享鎖(讀鎖):允許事務對一條行數據進行讀取;

互斥鎖(寫鎖):允許事務對一條行數據進行刪除或更新;
從名字上我們也能體會出來的就是,讀是可以兼容的(共享),而寫就是不兼容的(排他)

我們這裏再簡單介紹三種鎖:
Record Lock:就是加到索引記錄上的表,當使用輔助索引,不知道具體那條操作時,就需要對錶加鎖
Gap Lock:間隙鎖,間隙鎖是對索引記錄中的一段連續區域的鎖;當使用類似 SELECT*FROM users WHERE id BETWEEN10AND20FOR UPDATE;的 SQL 語句時,就會阻止其他事務向表中插入 id=15的記錄,因爲整個範圍都被間隙鎖鎖定了。旨在默寫事務的隔離級別中用到
Next-Key Lock:他是記錄所和間隙鎖的結合

事務和與隔離級別

介紹完鎖之後,我們介紹一下事務,事務給代價最大的印象應該就是他的原子性,即操作失誤,只要未提交,就可以rollback
事物遵循的ACID四大原則:原子性,一致性,隔離性,持久性

四種隔離級別(層次從低到高)

Read Uncommit 讀未提交 存在髒讀,不可重複度,幻讀的問題
用戶可以讀取未提交的記錄,也就是髒讀
Read Commit 讀提交 存在不可重複度,幻讀的問題
針對當前讀,保證對讀取到的記錄加鎖
Repeatable Read 可重複度InnoDB默認的一開始是存在幻讀問題的,後來通過使用(MVCC和GAP)改善了
保證對讀取到的記錄加鎖,同時波保證對讀取的範圍加鎖,新的滿足查詢條件的記錄,不能插入(GAP)
**Serializable ** 從MVCC併發控制退化成基於鎖的併發控制,讀寫衝突,讀+讀鎖,寫+寫鎖

下一篇我們就通過一個例子來分析一下InnoDb的加鎖過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章