【MySQL 的一些問題】

前言

1.前兩天汪某說自己秒了一個題,讓我看看,我看完之後感覺是線段樹+LCA。其實正解是樹鏈剖分+線段樹,好吧我發現自己其實還是不會手寫樹剖,就學着寫了寫。
2.電腦在週五突然不work了?????我感到了絕望,聯繫公司的大佬,準備給在寄一臺過來。
3.週六罕見的三人云合體,打了場比賽。說實話我就仔細寫了兩個小時,後邊因爲面試電話過來就溜了,就寫了三個水題,其他的是汪某和zwg寫的。最後
zwg幹掉了構造題:rank 36
在這裏插入圖片描述我因爲溜的早,估計wsx也溜了:rank 57,58.
在這裏插入圖片描述這場比賽沒有很厲害的隊伍,而且大概率賽前已經有題解了,所以其實沒怎麼在意。
正題:下面學習一下MySQL的各種知識。

MySQL特點

1.開源:這個詞其實是很重要的,開源,免費,是很多公司選他的主要原因。
2.插件式引擎:MySQL的SQL語句,是存儲引擎來執行的,至於選用哪種,可以自由選擇。很方便

引擎的特點

1.Innodb:這個是MySQL的默認存儲引擎,支持事務,是一種事務型引擎。支持B樹索引,B+樹索引
2.MyISam:不支持事務,不支持行級鎖(啥叫行級鎖?這個後邊再提)。但是支持全文索引(啥叫全文索引?),對索引可以有前綴壓縮。默認B樹索引。
當然了還有其他的很多,有十多種吧,而且還可以自己根據你的業務需求定製開發引擎,當然這個水平還是比較高的。還有一個比較有意思的引擎就是Memory,這個說實話我沒用過也不瞭解,只是記得它是默認支持的索引是Hash索引

讀寫鎖和鎖粒度

讀寫鎖就是鎖分爲兩種,讀鎖和寫鎖,也叫共享鎖和排他鎖。這個其實沒什麼好說的。鎖的粒度其實就是說的鎖的範圍,比如是鎖住整張表,還是鎖某一行,或者某個字段。一般都是鎖一行,這也叫做行鎖。行鎖實在存儲引擎裏面實現的。

事務

這個其實可以簡單理解爲:一組sql語句,他們要麼全部執行成功,要麼全部執行失敗。當然執行失敗就是回滾的意思了。其實這個特性就是原子性,操作系統裏面也叫不可中斷。

事務的四個特性

ACID是事務的四個特性
A(atomicity):原子性,上面已經描述了。
C(consistency):一致性,就是說數據庫的數據一致性,舉個例子就是,A給B轉賬,現在A有100,B也有100,他倆加起來200,A轉給B100,如果成功變成A:0,B:200,總和還是200,不成功就是A:100,B:100。不會出現失敗之後:A100,B:200 也就是總和一直都是200.這就是數據的一致性。當然了這個一致性大多數都是數據的一致性,其實也不僅僅是指這個,他指的是數據庫的狀態遷移到另外一個狀態,這兩個狀態都是合法的。
I(isolation):隔離性,就是兩個事務之間的數據是不可見的。
D(durability):持久性。這個其實概念比較寬泛,可以簡單的理解就是事務一旦成功,他對數據庫的修改就會一直存在。

事務的隔離級別

在ACID中有一個隔離性,講的是兩個事務之間操作數據的時候對對方是不是可見的,這個數據可見的等級,就是隔離的級別。
READ UNCOMMITED:未提交讀,這個指的是事務A讀了數據X,然後對X+1,這個修改還沒提交,事務B又讀了X,其實這個時候X已經不是正確的值了,這就是髒讀(Dirty Read).這裏其實事務所做的修改對其他事務時可見的,就是說其他的事務知道你改了,但是還會讀X。
READ COMMITED:提交讀。未提交讀的不同點就是事務之間的修改在未提交之前時不可見的,但是它可以看見已經提交的數據。這樣會造成一種不可重複讀的問題。
REPEATABLE READ:可重複讀,這個解決了髒讀的問題。但是無法解決幻讀,幻讀的意思就是A讀取了某個表的數據,然後B插了一條新的數據進來,結果A回來發現多了一行,就像出現了幻覺一樣,這個行也叫做幻行。Innodb 會有一種MVCC的解決方案,解決幻讀問題。
SERIALIZABLE:串行化,這個時最高的隔離級別,就是所有的事務都需要順序執行。

MVCC

MVCC就是多版本併發控制的縮寫。Innodb會在數據行的增加兩列, 一個是行的創建時間,一個是過期時間。這個時間其實並不是真的時間,而是一種系統自己給定的編號。每次事務創建時,系統就會給這個事務一個編號。以可重複讀爲例:
SELECT:
(1)只會查早行版本號早於這個事物的版本號的行並且需要這個行沒有被刪除。
INSERT:這個直接給行的版本號表記未當前的系統的版本號。
DELETE:這個會把刪除標記設置爲當前的版本號。
基本的工作原理大概就是這樣,這樣其實就避免了加鎖。效率比較高。

索引

突然不想寫了,留着明天再補,反正這兩天閒着。

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