MySql數據庫知識點總結01

數據庫架構

數據庫從大的方面可以分爲兩大部分,分別爲底層的存儲系統也就是文件系統,和上層的程序實例組成,程序實例有存儲管理、緩存管理、日誌管理、權限管理、容災管理、SQL解析、索引、鎖等

程序實:存儲管理、緩存管理、日誌管理、權限管理、容災管理、SQL解析、索引、鎖等
存儲:文件系統

MySQL體系結構

在這裏插入圖片描述

  1. MySQL插件式的存儲引擎,其中存儲引擎分很多種。只要實現符合mysql存儲引擎的接口,可以開發自己的存儲引擎!
  2. 所有跨存儲引擎的功能都是在服務層實現的。
  3. MySQL的存儲引擎是針對表的,不是針對庫的。也就是說在一個數據庫中可以使用不同的存儲引擎。但是不建議這樣做。

樂觀鎖和悲觀鎖

悲觀鎖:對數據持一種悲觀的態度,認爲在事務執行期間總是有別的事務修改數據,所以每一次操作都加鎖
樂觀鎖:對數據持一種樂觀的態度,所以不加鎖,樂觀鎖中每一項數據都有一個版本號,在事務提交的時候,通過版本號來看是否是否在事務A期間,事務B修改了數據,比如有兩個事務,事務A先查詢數據,此時數據的版本號爲0,事務B查詢版本也爲0,當A修改了數據並且版本變爲1,在提交是版本號1>0提交成功,此時事務也修改了數據把版本加一變爲1,在提交時版本號1不大於1,所以提交被駁回,數據過期

三範式

第一範式:字段不可分,只要是數據庫中存在的表都符合1NF
第二範式:消除了非主屬性對碼的部分依賴
第三範式:消除了非主屬性對碼的傳遞依賴

數據庫ACID的特性

A:原子性----一次事務是數據庫的最小執行單位,要麼事務內的所有操作做完,要麼全不做,事務期間只要有一個操作不成功,就回滾,回到事務開始之前
C:一致性----事務從一個一致性狀態轉移到另一個一致性轉態,比如:賬戶A有100,賬戶B也有100,加起來是200,當A給B轉了50後,A爲50,B爲150,加起來還是200,感覺有一點能量守恆的意思
I:隔離線----一個事務的操作在提交之前是對其他不可見的
D:持久性----一旦事務提交數據會被保存到磁盤永久有效

leftjoin和rightjoin、innerjoin的區別

leftjoin(左聯接) :包含左表的全部數據和右表中聯結字段相等的記錄
rightjoin(右聯接): 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
innerjoin(等值連接): 只返回兩個表中聯結字段相等的行

DROP,DELETE與TRUNCATE的區別

DROP會把一個表刪掉
DELETE刪除一個表的數據,一般配合where使用
TRUNCATE清空表中的數據,下一次在插入數據時自增長Id從1開始

UNION/ALL、EXCEPT/ALL和INTERSECT/ALL

union 合併兩個查詢結果,把兩個結果做並集並且刪除重複的行,union all不會刪除重複的行
expect 把兩個結果做查,包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重複行,expect all不消除重複的行
insert 把兩個結果集做交集 只包括 TABLE1 和 TABLE2 中都有的行並消除所有重複
行而派生出一個結果表 expect all不消除重複的行

InnoDB和MyISAM

InnoDB MyISAM
MySQL默認的引擎,支持行級鎖和表級鎖 ,支持事務 只支持表級鎖,不支持事務
適用大量的INSERT或UPDATE操作 適用大量的SELECT查詢

爲什麼MyISAM會比InnoDB的查詢速度快?

  1. InnoDB要緩存數據塊,而MyISAM只需要緩存索引快
  2. InnoDB尋址要先映射到數據塊在到數據行,而MyISAM記錄的直接是數據的OFESET,定位比InooDB塊
  3. InnoDB還需要維護MVCC一致

隔離級別

髒讀 讀取了一個事務還未提交的數據
不可重複讀 在同一個事務中兩次讀取的結果不一樣,和幻讀相比更側重數據的修改
幻讀 在同一個事務中兩次讀取的記錄數量不一樣,更偏向於插入操作帶來的不一樣
事務隔離級別 更新丟失 髒讀 不可重複讀 幻讀
讀未提交 (Read uncommitted) ×
讀已提交 (Read committed) × ×
可重複讀(Repeatable read) × × ×
序列化(Serializable) × × × ×

MySql在RR隔離級別下是如何避免幻讀的

  • 表象:快照讀也叫非阻塞讀 --僞MVVC
  • 內在: next-key鎖(行鎖+gap鎖)

快照讀和當前讀?
當前讀:加了鎖的增刪改查語句

快照讀:不加鎖的非阻塞讀,快照讀顧名思義會生成快照,在RC(Read Committed)隔離級別下每一次的select語句都會產生一個快照,所以會產生幻讀,在RR級別下,select語句執行的時間不同,生成的快照也會不同,如果有個事務的select語句執行的時候另一個事務還沒提交那麼這個事務就看不到另一個事務的修改,反之如果一個事務在另一個事務提交後執行了select語句那這個事務就可以看到另一個事務的修改也就是查詢可以看到自己之前已提的所有事務所做的更改,看不到在查詢開始之後的事務提交的更改

快照讀是如何實現的?

  • DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID
  • undo日誌
  • read view

我們在建立表的時候,除了我們自己指定的一些字段,數據庫會給我們默認加上一些字段,其中DB_TRX_ID就是事務的ID,DB_ROLL_PTR就是回滾的指針指向undo log,DB_ROW_ID當我們建表時沒有指定主鍵,數據庫就會指定一個ID

下面是快照讀的一個例子
事務A修改了FIeld2,把12改爲32,當修改的時候會把數據複製一份到undo log中,然後鎖定當前行,DB_TRX_ID變爲1,DB_ROLL_PTR指向undo log日誌
在這裏插入圖片描述
另一個事務B也修改了數據把Filed3從13改爲45,此時也會把原來的數據拷貝一份到undo log日誌中,DB_TRX_ID變爲2
read view可見性算法,決定了當前事務可以看見那個版本的數據,read view會把當前的DB_TRX_ID和系統其它的DB_TRX_ID對比,如果比其他大就可以看到
在這裏插入圖片描述

next-key鎖?

MySql在RR隔離級別下實際上是通過next-key鎖避免幻讀的,next-key鎖就是行鎖+gap鎖,gap會把一個範圍鎖起來,比如一個表的索引是1,3,5,當執行select * from table where id > 3;就會把>3的範圍鎖起來,當在另一個事務中插入一條id爲4的數據時,就會被阻塞,只有當事務提交以後,另一個事務才能繼續執行插入語句

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