mysql suoyin 和鎖 MySQL索引與鎖

2021-10-18 03:26:51 字數 3019 閱讀 6540

每個資料頁裡面的記錄可以組成乙個單向鍊錶。

在沒有任何索引的的表中,select語句的執行會進行如下兩次遍歷遍歷雙向鍊錶,找到所在頁

遍歷頁內的單鏈表,找到所在的記錄

索引提高檢索速度

索引的主要作用就是將無序變成有序。

record_type=1 代表存放的是普通目錄項的記錄

record_type=0 代表存放的是普通使用者的記錄

底層結構一般都是b+樹,b+樹是平衡樹的一種,它是乙個空樹或者是左右子樹的高度差的絕對值不會超過1,左右子樹都是一顆平衡二叉樹。深度為lgn

索引在提高檢索速度的同時,同時會降低增刪改的速度,因為要對b+樹做增刪改的話,會破壞它原來的結構,而且要維護平衡樹,就必要做額外的工作。

聚集索引和非聚集索引

概括:聚集索引是以主鍵建立的索引。

非聚集索引是以非主鍵建立的索引。

innodb要求表必須有主鍵(myisam可以沒有),innodb會按照如下規則進行處理:

如果乙個主鍵被定義了,那麼這個主鍵就是作為聚集索引

如果沒有主鍵被定義,那麼該錶的第乙個唯一非空索引被作為聚集索引

如果沒有主鍵也沒有合適的唯一索引,那麼innodb內部會生成乙個隱藏的主鍵作為聚集索引,這個隱藏的主鍵是乙個6個位元組的列,改列的值會隨著資料的插入自增。

區別:聚集索引在葉子節點儲存的是表中的資料。

非聚集索引在葉子節點儲存的是主鍵和索引列。

使用非聚集索引查詢出資料時,拿到葉子上的主鍵再去查想要查詢的資料。(拿到主鍵再去查詢的這個過程叫做回表)

聚集索引是物理上的連續,而非聚集索引是邏輯上的連續,物理儲存並不連續。

非聚集索引和聚集索引的區別在於:通過聚集索引可以查到需要查詢的資料, 而通過非聚集索引可以查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查詢到需要的資料

覆蓋索引:如果不是聚集索引,葉子節點儲存的是主鍵+索引列,如果需要查詢的列,葉子節點都存在,那麼就不用回表,提高效率。

索引最左匹配原則

最左匹配原則:索引可以簡單如乙個列(a),也可以複雜如多個列(a, b, c, d),即聯合索引。

如果是聯合索引,那麼key也由多個列組成,同時,索引只能用於查詢key是否存在(相等),遇到範圍查詢(>、

因此,列的排列順序決定了可命中索引的列數。

例子:如有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會在每個節點依次命中a、b、c,無法命中d。(很簡單:索引命中只能是相等的情況,不能是範圍匹配)

索引總結最左匹配原則

盡量選擇區分度高的列作為索引

索引列不能參與計算,盡量保持列乾淨

盡可能擴充套件索引,不要新建立索引

表鎖(innodb行鎖表鎖都支援,myisam只支援表鎖)表鎖:開銷小,加鎖快,不會出現死鎖,鎖的粒度大,併發度低。

行鎖:開銷大,加鎖慢,會出現死鎖,鎖的粒度小,併發度大

行鎖innodb支援行鎖

innodb支援表鎖

行鎖型別:共享鎖(s鎖):允許多個獲得共享鎖的事物同時讀取同乙個資源,但不允許其他客戶端修改

排他鎖(x鎖):允許獲得排他鎖的事物更新資料,阻止其他事物修改或讀取同一資料集。

樂觀鎖與悲觀鎖樂觀鎖(認為乙個使用者讀資料時,別人不會去寫自己所讀的資料):在表中新增乙個版本字段,第一次讀的時候,獲取到這個字段,處理完業務邏輯準備更新的時候,需要再次檢視這個字段是否和第一次獲取到的字段是否一樣,若一樣則更新,否則則拒絕。

悲觀鎖(在讀取資料是,不允許別人去修改):直接在把資料庫層面上加鎖。

事物的隔離級別

什麼是事務

事物是邏輯上的一組操作,要麼全部執行,要麼全部不執行。

事務的特性(acid)原子性:事務是最小的執行單位,要麼全部執行,要麼全部不執行

一致性:在事務執行的前後,所有事務對同一資料來源的讀取結果的一致的

隔離性:併發訪問資料庫時,各個事務互不干擾

永續性:在事務提交之後,它對資料庫的改變是持久的,即使資料庫發生故障,也不會有任何影響。

併發事務帶來的問題髒讀:當乙個事務對資料進行了修改之後就馬上釋放了排它鎖,導致其它事務對未修改的資料進行了「髒資料」。

丟失修改:指兩個事務同時對同乙個資料進行了修改操作,導致乙個事務的修改丟失

不可重複讀:指在同乙個事務中,對同乙個資料進行多次讀取,但是讀出來的結果不一致,這裡側重於資料修改

幻讀:在同乙個事務中,同一次查詢會多出或者少了一些資料,這是因為另乙個併發的任務作出了增刪操作,這裡側重與資料的增刪

sql標準定義的四個隔離級別(innodb 預設支援可重複讀)read-uncommitted(讀取未提交): 最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀。

read-committed(讀取已提交): 允許讀取併發事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生。

repeatable-read(可重複讀): 對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。

serializable(可序列化): 最高的隔離級別,完全服從acid的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。

參考資料

mysql suoyin 和鎖 Mysql索引與鎖

mysql索引與鎖 mysql索引與鎖 本文以mysql5.7為例測試。1 mysql索引方法 mysql的索引方法分為btree索引和hash索引。hash索引 是通過hash計算後比較,所以只能用於等值過濾,不能用於範圍過濾。hash索引會根據列資料維護一張hash表,所以任何時候都要進行has...

使用systemctl命令啟動和關閉mysql

以前都用service命令管理mysql,現在liunx系統公升級了,又有了新的更好的方法管理系統程序,現在我們來學習如何用systemctl命令管理mysql。systemctl是乙個systemd工具,主要負責控制systemd系統和服務管理器。systemd是乙個系統管理守護程序 工具和庫的集...

使用systemctl命令啟動和關閉mysql

以前都用service命令管理mysql,現在liunx系統公升級了,又有了新的更好的方法管理系統程序,現在我們來學習如何用systemctl命令管理mysql。systemctl是乙個systemd工具,主要負責控制systemd系統和服務管理器。systemd是乙個系統管理守護程序 工具和庫的集...