一文回顧mysql

2021-09-29 02:56:25 字數 2771 閱讀 5251

索引事務

鎖機制主要介紹myisam和innodb,在伺服器中,用於儲存資料會生成以下檔案

innodb採用的是b+樹作為索引的資料結構

經常用的列優先(最左匹配原則)

離散型高的列優先(離散度高原則)

寬度小的列優先(最小空間原則)提高每個節點的路數

索引按場景建,建多了會導致增刪改的時候,需要維護索引的時間,導致語句執行時間增加

like語句的時候 lke ***%不一定會用到索引,得看優化器的優化,離散型差會直接全表掃瞄

not in,<>操作用不到索引,b+樹無法判斷走哪路

rder by可以用索引,葉子節點有順序

最左匹配原則的時候:如果某個列用到範圍查詢,則右邊所有列無法使用索引

mysql手動開啟事務,通過start transaction

jdbc:connection.setautocommit

spring aop 通過切面控制

原子性(atomicity):事務操作要不全部成功,要不全部失敗回滾

一致性(consistency):事務執行前和執行後必須處於一致性狀態

隔離性(isolation):多個併發事務之間要相互隔離

永續性(durability):乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的

髒讀:讀取到事務未提交的資料(兩次讀取不一致update或者delete操作)

不可重複讀:讀取到事務已經提交的資料(兩次讀取不一致update或者delete操作)

幻讀:讀取到事務插入的資料(兩次讀取不一致insert操作)

db_trx_id:最新一次修改本行記錄的操作id

db_row_id:標識記錄

undo log:事務開始之前的資料備份,用於資料回滾,事務執行前會在快取中的undo buffer備份舊的資料,當長時間未處理或者未更改則寫入磁碟

redo log:實現事務的永續性,重啟mysql可以通過redo log進行重做

取值 0 每秒提交 redo buffer --> redo log os cache -->flush cache to disk

取值 1 預設值,每次事務提交執行redo buffer --> redo log os cache -->flush cache to disk

取值 2 每次事務提交執行redo buffer --> redo log os cache 再每一秒執行 ->flush cache to disk操作

通過mvcc(multi-version concurrent control多版本併發控制)+undo log實現

rc隔離級別下:一次事務下每個讀資料的操作都會生成乙個新的read view(快照),db_trx_id+1

rr隔離級別下:一次事務下第一條讀資料的操作會生成乙個快照

可認為是加鎖讀 rr級別下通過臨鍵鎖(間隙鎖+臨界鎖)實現

mysql客戶端/服務端通訊:半雙工->同一時間只有一方可以傳送訊息(類似踢足球)

全雙工:雙方可以同時傳送訊息(**)

單工:只能單向傳輸

show processlist指令檢視當前連線狀態

查詢快取:sql和結果集的快取,如果sql完全一致,則返回快取(預設關閉)

查詢優化處理

a. 解析sql:通過 lex此法分析,yacc語法解析成解析樹(簡單認為解析成可處理的物件)

b. 預處理階段:mysql語法規則校驗,檢查表列是否存在,進行許可權校驗

查詢優化器:找到最優執行計畫

c. 等價變換規則:比如查詢條件是a>b and b=5 就會轉換成a>5 and b=5

d. in和or的區分:in(1,2,3)採用二分法比對,相等就返回,or1 or2 or3即使匹配了仍繼續比對 複雜度為logn和n,in有做二分優化(排序在二分查詢),所以盡量用in語句

e. 外連線查詢會轉換成內連線

f. 優化count、min、max函式 可以直接找b+樹葉子節點的最大值和最小值

g. 覆蓋索引(查詢乙個組合了主鍵id的列)也是覆蓋索引,因為葉子節點也包括主鍵id

h. limit優化:值查詢到limit最後乙個節點,之後的資料不在做遍歷

查詢執行引擎:呼叫執行計畫

返回客戶端:

是否需要做快取處理

增量返回,在第一次拿到資料後就開始逐量返回

id相同,執行順序由上到下

id不同,存在子查詢會遞增,id高的先執行

select_type:

(1) ******:簡單查詢,沒有子查詢或者union

(2) primary:包含子查詢,最外層為primary

(3) subquery/materialized:sub標識在select或者where中包含子查詢,mat表示where後面in條件的子查詢

(4) 若第二個select出現在union之後,標記為union

(5) union result:從union表獲取的結果的select

table:設計的表

type:訪問型別

const:一次索引找到資料

sq_ref:唯一索引掃瞄,對於每個索引鍵,只有一條記錄

possible_keys:可能用到的索引

key:實際用到的索引

rows:估算讀取的行數

filtered:返回結果佔讀取行數的百分比

extra:額外資訊,比如用到臨時表,檔案排序等

慢查詢日誌

慢查詢工具:mysqldumpslow

iot mysql 一文了解Mysql

資料庫中的幾個基本術語?mysql中innodb引擎支援的4種事務隔離級別 mysql中如何使用enum?mysql中的儲存引擎 mysql中char與varchar的區別?主鍵和候選鍵的區別?blob和text的區別?mysql中的鎖 資料庫三正規化 什麼是資料庫?資料庫其實顧名思義就是儲存資料的...

期末 一文帶你系統回顧C 語言

c 語言是一種底層語言,是一種系統底層級的語言,例如windows linux unix等作業系統就是使用c語言編寫的。所以由此看來,不論是火爆了25年的j a,還是近年來愈來愈流行的python,它們雖外表光鮮亮麗,但c語言就是內在的靈魂,樸實無華。c 語言既然這麼重要,但是它有什麼值得我們去學的...

一文搞懂MySQL的Join

經常聽到2種觀點 其實對於上面的觀點一定程度上是正確的,但不是完全正確。但之所以流傳這麼廣,主要還是沒有搞清楚實際狀態,而根據實際使用中總結出來的一些模糊規律。只有了解的mysql的join實際執行方式,就會知道上面2種觀點是一種模糊的規律,這種規律並不能指導我們實際開發。下面就說說mysql的實際...