數據庫的總結

存儲引擎

InnoDB(B+樹)

InnoDB 底層存儲結構爲B+樹,其中非葉子節點只有鍵值,葉子節點包含完成數據

MyIASM

MyIASM是 MySQL默認的引擎,缺點是它不 支持事務處理。

Memory

因爲它的數據是放在內存中的,並且默認使用HASH 索引。但是一旦服務關閉,表中的數據就會丟失掉。

索引

索引(Index)是幫助 MySQL 高效獲取數據的數據結構。

B樹索引(常用的索引方式);

hash索引(key,value),對範圍查詢不友好;

數據庫三範式

第一範式:列都是不可再分

第二範式:表中非主鍵列不存在對主鍵的部分依賴。

第三範式:不存在對非主鍵列的傳遞依賴

數據庫是事務

事務必須具備以下四個屬性,簡稱 ACID 屬性:
1. 原子性(Atomicity)
事務的各步操作是不可分的;要麼都執行,要麼都不執行。
2. 一致性(Consistency)
當事務完成時,數據必須處於一致狀態。
3. 隔離性(Isolation)
事務必須是獨立的,執行的時候不依賴於或影響其他事務。
4. 永久性(Durability)
事務對數據庫的修改被永久保持。

時間戳:每次讀出來的時候,把該字段也讀出來,當寫回去的時候,把該字段加 1,提交之前 ,跟數據庫的該字段比較一次,如果比數據庫的值大的話,就允許保存,否則不允許保存

數據庫鎖

共享鎖(S鎖):樂觀鎖的一種,持有樂觀鎖的事務,可以對其進行讀和寫操作,其他的事務只能讀不能寫;

排它鎖(X鎖):其他事務不能夠讀和寫

通過update或者後面加上for update就會上排它鎖

意向排它鎖(IX鎖):在獲取排他鎖之前先獲取意向排它鎖,當有其他事務拿到了排它鎖,他就能馬上知道拿不到鎖了,注意目的是提高一個返回信息的速度。

意向共享鎖(IS鎖):同理

自增鎖:id自動增長,當你刪除了數據之後,加添加數據的時候,id是繼續之前刪除的那個id繼續增長的

臨鍵鎖:左開右閉的加鎖方式,範圍查找的時候加的鎖

間隙鎖:臨鍵鎖是裏面有內容的,而間隙鎖鎖住的是沒有內容的區域,其他事務只要是在90--222之間的不管有沒有包括的都不可以獲取

表級鎖:當對非索引屬性加鎖的時候就會建立表級鎖,

行級鎖:行鎖就是給索引的索引項上鎖,如果對索引屬性加鎖的話會建立行級鎖

mysql的索引使用的是B+Tree,非葉子節點作爲索引鍵值,而葉子結點存放所有數據,所以鎖的對象是索引對象。所以如果鎖的屬性不是索引的話,就會鎖上整張表。

基於 Redis 分佈式鎖

1. 獲取鎖的時候,使用 setnx加鎖,鎖的 value值爲一個隨機生成的 UUID,在釋放鎖的時候進行判斷。 並使用 expire 命令爲鎖添加一個超時時間,超過該時間則自動釋放鎖。

2.釋放鎖的時候,通過 UUID 判斷是不是該鎖,若是該鎖, 則執行 delete 進行鎖釋放。

分區分表

分庫分表有垂直切分和水平切分兩種

 

數據庫四種隔離級別

使用事務

串行化:事務“串行化順序執行”,最高隔離級別

幻讀:事務A在進行update或者insert操作,事務B隨後也進行update或者insert操作,事務B提交之後,事務A在沒有執行提交之前查看不到事務B對數據做的修改,等事務A提交之後,發現數據被修改了或者數據多了。這就是幻讀。(使用臨鍵鎖)

可重複讀:如果一個事務成功執行並且添加或者修改了新數據,這些數據對其他正在執行的事務是不可見的;

不可重複讀:事務A在使用數據的時候,事務B對該數據進行update操作,然後提交了,事務A就會出現第一次讀到的數據和後面讀到的數據不一致。事務A修改該數據的時候使用共享鎖,這樣的話事務B就不能就行update操作了;

幻讀和不可重複讀的區別是,前者是一個範圍,後者是本身

讀提交:只能讀到已經提交了的內容

髒讀:事務A進行select操作,而事務B進行update操作,但是並沒有提交,這時候就會導致事務A讀到的都是錯誤的信息。(上一把排他鎖就可以解決)

讀未提交:可以讀到未提交的內容

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