天天看點

Mysql相關知識

一、Mysql的鎖

1、按粒度分

(1)行鎖:鎖某行資料,鎖粒度最小,并發度高

(2)表鎖:鎖整張表,鎖粒度最大,并發度低

(3)間隙鎖:鎖的是一個區間

2、讀寫層面分

(1)共享鎖:也就是讀鎖,一個事務給某行資料加了讀鎖,其它事務可以讀,但不能寫

(2)排它鎖:也就是寫鎖,一個事務給某行資料加了寫鎖,其他事務既不能讀,也不能寫

3、樂觀悲觀層面

(1)樂觀鎖:并不會真正的去鎖某行記錄,而是通過一個版本号來實作

(2)悲觀鎖:上述的行鎖、表鎖等都是悲觀鎖

二、Mysql慢查詢如何優化

(1)檢查是否索引了,沒有則優化SQL,利用索引;有則優化索引,看是否是最優索引

(2)檢查是否查了不必要字段,查出來多餘資料

(3)檢查表中資料是否過分,是否該進行分庫分表了

(4)檢查資料庫所在機器性能配置

三、Mysql索引

1、索引意義 ———提高查詢效率的資料結構

(1)優點:大大提高查詢速度

(2)缺點:維護索引耗費資料庫資源;占磁盤空間;增删改時,同時要維護索引,速度會受到影響;

2、索引分類及建立

show index from table名 查詢表中的索引

(1)InnoDB

  — a.主鍵索引:設定為主鍵後資料庫自動建立索引,innodb為聚簇索引 主鍵索引清單不能有空

主鍵索引建表自帶

  — b.普通索引:(單列/值索引),一個表可以有多個普通索引

create index 自定義索引名 on 表名(字段名)        ——建表後

create table 表名(key(字段名),key(字段名),…)    ——建表時

  — c.唯一索引:索引的值必須唯一(并不是說唯一索引隻能有一個),可且僅可存在一個null

參考普通索引,隻是關鍵字變成unique

  — d.複合索引:即一個索引包含多個列(這個索引的建立由多個列共同決定,如根據某幾個條件                  同時查資料)

參考普通索引,參數變成多個

注意:1.最左字首原則 2.mysql引擎在查詢時為了更好的利用索引,查詢時會動态調整查詢字段順序

如:建立複合索引順序:name,age,bir字段

基于 name bir age 查 ----可以

基于 name age bir 查----可以

基于 bir age 查----不可以

基于 bir age name 查----可以

基于 age name 查----可以

(2)MyISAM

  — e.Full Text(全文索引)

3、索引底層

(1)主鍵索引自動排序
Mysql相關知識

(2)資料底層進化

① 連結清單

Mysql相關知識

②資料量過大,分頁

Mysql相關知識

③ 頁目錄(頁目錄不存儲資料,而是把主鍵和指針拎出來)

Mysql相關知識

④進化成B+樹結構(最頂層根節點常駐記憶體,就是說第一次不需磁盤I/O,減少磁盤I/O,提高效率)

Mysql相關知識

【注意】:B樹的差別在于,B+樹所有葉子節點之間有一個鍊指針,B樹每個節點不僅包含資料的key值,還有data資料,而我們知道,每頁存儲空間有限,一旦data資料較大,每個節點(即每一頁)能存儲的key就少了,當存儲資料量過大時就會導緻B樹深度較大,增大查詢時的詞磁盤I/O次數,進而影響查詢效率。

【小結mysql索引底層結構描述】:

【答】:mysql索引底層是一個B+樹的資料結構。首先,我們對在表中插入資料時,mysql底層會基于資料做一個排序,排序後會以連結清單的形式将資料連結起來,同時,mysql還做了進一步優化,基于B+樹的結構,對資料進行一頁頁的存儲,每頁預設存儲16KB,一般三層B+樹存儲量再8-10億位元組左右,我們的項目一般兩層足矣,如果我們基于主鍵查詢,最多一次磁盤I/O,因為頂層是常駐記憶體的。

四、Mysql的隔離級别

  • READ-UNCOMMITTED(讀取未送出):最低的隔離級别
  • READ-COMMITTED(讀取已送出)
  • REPEATABLE-READ(可重複讀) (InnoDB預設支援的隔離級别)
  • SERIALIZABLE(可串行化)

!!可重複讀的原理

為了解決不可重複讀,MySQL采用了MVVC(多版本并發控制)的方式解決該問題,我們在資料表中看到的一行記錄可能實際上有很多版本,還要有一個表示版本的字段,記為row_trx_id,而這個字段就是使其産生的事務的id,事務ID記為transaction id,它在事務開始的時候向事務系統申請,按時間先後順序遞增。
在這個級别下,普通的查詢同樣是使用的“快照讀”,但是,和“讀送出”不同的是,當事務啟動時,就不允許進行“修改操作(Update)”了,而“不可重複讀”恰恰是因為兩次讀取之間進行了資料的修改,是以,“可重複讀”能夠有效的避免“不可重複讀”,但卻避免不了“幻讀”,因為幻讀是由于“插入或者删除操作(Insert or Delete)”而産生的。
換句話說,“讀取送出”的隔離級别,在讀資料時不用排它鎖,而是使用MVVC機制擷取目前資料的最新快照,這個機制發生在每次select時,意味着我們前後兩次讀取的同一個資料會被其他事務修改,出現不可重複讀。 而“可重複讀”這種隔離級别在使用MVVC機制時,一次事務隻在第一次select時生成版本,後續的查詢都是在這個版本上進行,以此實作可重複讀。