近一個多月,寫了一些MySQL內核的文字,稍作總結,希望對大家有幫助。
1.《InnoDB,爲何併發如此之高?》
文章介紹了:
(1)什麼是併發控制;
(2)併發控制的常見方法:鎖,數據多版本;
(3)redo,undo,回滾段的實踐;
(4)InnoDB如何利用回滾段實現MVCC,實現快照讀。
結論是,快照讀(Snapshot Read),這種不加鎖的讀,是InnoDB高併發的核心原因之一。
番外篇:《快照讀,在RR和RC下的差異》
快照讀,在可重複讀與讀提交兩種事務隔離級別下,有微小的差異,文章通過案例做了簡單敘述。
2.InnoDB的七種鎖
先從一個有意思的案例,引出了鎖的話題。
假設有數據表:
t(id int PK, name);
目前的記錄是:
10, shenjian
20, zhangsan
30, lisi
事務A先執行,並且處於未提交狀態:
delete from t where id=40;
事務A想要刪除一條不存在的記錄。
事務B後執行:
insert into t values(40, ‘c’);
事務B想要插入一條主鍵不衝突的記錄。
問題1:事務B是否阻塞?
問題2:如果事務B阻塞,鎖如何加在一條不存在的記錄上呢?
問題3:事務的隔離級別,索引類型,是否對問題1和問題2有影響呢?
接下來的幾篇文章詳細的介紹了InnoDB內核中的七種鎖。
這一篇,介紹了InnoDB內核的第一種鎖,自增鎖(Auto-inc Locks)。
這一篇,介紹了InnoDB內核的三種鎖:
● 共享/排他鎖(Shared and Exclusive Locks)● 意向鎖(Intention Locks)
● 插入意向鎖(Insert Intention Locks)
這一篇,介紹了InnoDB內核最有意思的三種鎖:
● 記錄鎖(Record Locks)● 間隙鎖(Gap Locks)
● 臨鍵鎖(Next-Key Locks)
這幾篇文章,有大量的案例,相信大家會有收穫。
3.索引到底是怎麼實現的?
這兩篇文章很重要,講解MySQL索引底層實現,也是閱讀量最高的幾篇之一。
這一篇,介紹了哈希索引,樹索引,數據預讀/局部性原理,B+樹的優化思路。
在上一篇基礎之上,用圖例講述了MyISAM與InnoDB的索引差異與實踐。
4. 《InnoDB如何巧妙實現,事務的4種隔離級別?》
聊MySQL,聊鎖,聊事務,一定逃不開事務的隔離級別,本文簡述了讀未提交,讀提交,可重複讀,串行化的巧妙實現。
5.《別廢話,各種SQL到底加了什麼鎖?》
這是一篇直接給結論的文章:
● 加鎖select
● update與delete
● insert
各類SQL語句分別加了什麼鎖?
6.《超讚,InnoDB調試死鎖的方法!》
死鎖的復現和調試都是很困難的,本文通過幾個案例,分享了復現與調試併發事務+死鎖的方法,大家一定要動起手來,這樣印象纔會更加深刻。
本文分享了MySQL中最常見的兩類約束:主鍵與唯一索引約束,並細聊了這兩類約束在InnoDB與MyISAM上的差異,有個MyISAM大坑,一定要注意繞過。
8.其他
《InnoDB的五項最佳實踐,知其所以然》
這是一篇聊InnoDB實踐的文章:關於count(*),關於全文索引,關於事務,關於外鍵,關於行鎖與表鎖,不僅會使用,還要知其所以然。
MySQL5.6,介紹了InnoDB的一些新特性,例如:居然能夠支持memcached插件了,居然能把InnoDB表放在DVD或者CD裏,是不是有點意思?
這個數據庫內核系列,寫了約1個多月,查閱了大量官網英文資料,也自己動手實踐了很多案例,以確保知識的體系性與準確性,希望大家有收穫。
最近,回顧了一下18年的文章,下面這一篇是最有希望破10W+的:
煩請大夥幫忙轉發一下這篇,未來樓主能夠自豪說“俺也是寫過10W+的人”。
最近微信改版,很多朋友反饋看不到最新的文章,有個辦法是,置頂,哇咔咔。
畫外音:有位網友的留言讓我很感動,“這是浮躁的自媒體圈,原創與乾貨多,且值得置頂的一股清流”。
知其然,知其所以然。
思路比結論重要。
原文發佈時間爲:2018-10-9
本文作者: 58沈劍
本文來自雲棲社區合作伙伴“架構師之路”,瞭解相關信息可以關注“架構師之路”。