隱##1.物理存儲結(jié)構(gòu)
1.1 表空間
MySQL支持兩類表空間: 共享、獨立
不同版本的差異:
5.5版本:
默認(rèn)共享表空間管理模式.包含:數(shù)據(jù)字典\undo\tmp\用戶表數(shù)據(jù)和索引
5.6版本:
默認(rèn)獨立表空間.
包含:數(shù)據(jù)字典\undo\tmp,將用戶數(shù)據(jù)和索引獨立,每個表單獨存儲。
一個表一個ibd文件,存儲數(shù)據(jù)行和索引信息。
5.7版本:
默認(rèn)獨立表空間.
包含:數(shù)據(jù)字典\undo,tmp獨立,將用戶數(shù)據(jù)和索引獨立,每個表單獨存儲
8.0版本:
默認(rèn)獨立表空間.
數(shù)據(jù)字典取消掉,undo, tmp獨立將 用戶數(shù)據(jù)和索引獨立,每個表單獨存儲
1.2 功能名詞介紹
磁盤結(jié)構(gòu)相關(guān):
transaction 事務(wù)
undo : ibdata1 #回滾日志(保留事務(wù)之前的狀態(tài))
tmp : ibtmp1 #臨時表空間磁盤位置,存儲臨時表
redo : ib_logfile0-N #重做日志
ibd : t1.ibd #表空間數(shù)據(jù)文件。表的數(shù)據(jù)行和索引
frm #存儲表的列信息
內(nèi)存結(jié)構(gòu):
Innodb Buffer Poll #數(shù)據(jù)緩沖區(qū)池(環(huán)境中給70-80%物理內(nèi)存)《緩沖數(shù)據(jù)和索引頁》《順序IO存儲空間》
(三個不同磁盤上,有三個不同無順序表文件
經(jīng)常被訪問(熱數(shù)據(jù))內(nèi)存數(shù)據(jù)頁,放到緩沖區(qū),以后訪問不用加載到磁盤
通過Innodb Buffer Poll 功能把數(shù)據(jù)作為順序IO
缺點 :關(guān)機慢(要將數(shù)據(jù)放到緩沖區(qū)),啟動慢
log buffer #重做日志緩沖區(qū)
LSN #日志序列號 #相當(dāng)于日志版本號
Rrx_id #事務(wù)ID號
checkpoint #檢查點
1.3事務(wù)
1.3.1 什么是事務(wù)?
將多條DMl(標(biāo)準(zhǔn)的事務(wù)語句),放在一個組中運行,要么全成功要么全失敗。
1.3.2 事務(wù)ACID特性atomicity, consistency, isolation, and durability.
Atomic:原子性 :每一個事務(wù)都是一個完整整體,不可再分性.要么全執(zhí)行成功要么全失敗.
Consistent:一致性 :在事務(wù)前,中,后,保證事務(wù)操作的數(shù)據(jù)前后一致.
Isolated:隔離性:多個事務(wù)之間,所做事務(wù)互不干擾,不能同時更新同一行數(shù)據(jù).
Durable:持久性 :事務(wù)完成之后,所涉及到的數(shù)據(jù),必須永久有效(落地)
1.3.3 事務(wù)的生命周期管理
(1) 開啟一個事務(wù)
begin / start transaction;
(2) 標(biāo)準(zhǔn)的事務(wù)語句
insert
update
delete
(3) 結(jié)束事務(wù)
commit;#提交事務(wù)
rollbackup; #回滾事務(wù) #只能提交之前做。
非標(biāo)準(zhǔn)的事務(wù)生命周期
1) 自動提交機制(autocommit)
只要是DML語句,自動添加
1.begin子句會自動添加
2.因為 MySQL5.6版本后,每一條執(zhí)行完成之后都會自動提交
mysql> select @@autocommit;#查看是否開啟這項功能(自動提交)
永久關(guān)閉參數(shù):@@autocommit功能
vim /etc/my.cnf

說明:默認(rèn)情況下,開啟事務(wù)時不加begin,逐條自動提交.手工開啟begin命令,按照正常事務(wù)工作過程.
2)隱式提交(當(dāng)打開一個事務(wù),操作后沒有進行提交,進行DDL語句操作后,開始執(zhí)行的操作會自動提交,無法回滾)
用于隱式提交的 SQL 語句:
SET AUTOCOMMIT = 1
導(dǎo)致提交的非事務(wù)語句:
DDL語句: (ALTER、CREATE 和 DROP)
DCL語句: (GRANT、REVOKE 和 SET PASSWORD)
鎖定語句:(LOCK TABLES 和 UNLOCK TABLES)
導(dǎo)致隱式提交的語句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE
3)隱式回滾
原因:
會話斷開
數(shù)據(jù)庫重啟
死鎖
1.3.4 事務(wù)底層的工作過程
畫圖說明.
(1) redo
分布:
內(nèi)存: log buffer
磁盤: ib_ logfile0~N
功能:
?。?.保存內(nèi)存數(shù)據(jù)頁的變化
>2. commit時, 實現(xiàn)事務(wù)的快速持久化的特性:量少, 順序I0
>3.宕機時,通過redo實現(xiàn)重做事務(wù),將數(shù)據(jù)庫恢復(fù)到宕機之前的狀態(tài).
我們由把這步稱之為ACSR中的"前滾"操作
2)undo 回滾日志
分布: 默認(rèn) ibdata1, 5.7 開始使用可以獨立undo,8.0后自動獨立
功能:
1.保存當(dāng)前事務(wù)操作的反操作
2.在執(zhí)行rollback命令時, undo提供回滾操作,實現(xiàn)原子的特性。
3.宕機時,ACSR過程中提供回滾操作(將沒有commit標(biāo)記的)
1.3.5 鎖 及隔離級別主要保證隔離性
1)鎖:
S: 共享鎖,讀鎖
X: 排它鎖,寫鎖
IS: 意向S(想要有哪個鎖)
IX: 意向X
兼容
S-S:
S-IS:
不兼容
X和任何鎖都不兼容
2)鎖的細(xì)分
TX: 表鎖 DDL
RX: 行鎖 DML
GAP LOCK X: 間隙鎖 特殊DML
Next LOCK X: 下一鍵鎖定
3) 隔離級別(transaction_isolation)
RU: 讀未提交----READ-UNCOMMITTED
模擬:
session A
mysql> begin;
mysql> use world
mysql> delete from city where id=1000;
session B
mysql> begin;
mysql> use world
mysql> select *from city where id=1000;
**會產(chǎn)生的問題: **
- 臟讀
- 不可重復(fù)讀現(xiàn)象
- 幻讀
RC: 讀已提交----READ-COMMITTED
- 不可重復(fù)讀現(xiàn)象
- 幻讀
RR: 可重復(fù)讀----REPEATABLE-READ
- 幻讀
說明:- RR級別+ GAP+ Next lock(GAP+RX)有效防止幻讀現(xiàn)象
- 通過MVCC,多版本并發(fā)控制中,一致性快照讀技術(shù),解決了不可重復(fù)讀問題.
SR: 串行
2. InnoDB 存儲引擎核心參數(shù) *****
mysql> select @@innodb_data_file_path;
mysql> select @@innodb_file_per_table;
mysql> select @@innodb_buffer_pool_size; #不要超過80%物理內(nèi)存 ----> Out of memory
mysql> select @@innodb_log_buffer_size;
mysql> select @@innodb_log_file_size;
mysql> select @@innodb_log_file_in_group;
mysql> select @@innodb_flush_log_at_trx_commit; # 雙1標(biāo)準(zhǔn)之一.控制redo刷寫的策略.
0 每秒鐘刷寫redo到磁盤.
1 每次事務(wù)提交,理解刷寫redo到磁盤
2 每次事務(wù)提交,立即寫日志到OS cache中,然后每秒鐘刷寫到磁盤.
mysql> select @@innodb_flush_method; 控制(buffer臟頁,redo buffer日志)刷寫方式建議設(shè)置:
O_DIRECT : 數(shù)據(jù)頁刷寫磁盤直接穿過文件系統(tǒng)緩存,redo 刷寫時,先寫os cache,再寫到磁盤。