索引事務
鎖機制主要介紹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的實際...