插件式存儲引擎mysql
客戶端請求連接線程進行處理,先查看數據庫的緩存,若緩存有直接返回,沒有經過分析器,優化器 ,在存儲引擎中查詢數據,返回,sql
如圖 c端是客戶端,經過相應連接器連接數據庫數據庫
s端是服務器端,mysql是有單進程多線程進程管理的緩存
鏈接池:負責連接,認證,控制等安全
鏈接池下面是mysql的主體服務器
Sql interface:sql接口session
Paraser: 語法分析多線程
Optimizer:優化器來優化併發
caches: 緩存器函數
Piuggable storage engines: 插件式存儲引擎,負責這麼存儲數據經常使用的5.0以前是myisam
5.0以後是innodb
最後將數據轉存在磁盤上的文件,有日誌文件(錯誤日誌,二進制日誌,慢查詢日誌)和數據(數據,索引)文件
插件式存儲引擎:innodb是功能最完善的引擎了
>SHOW ENGINES; 查看所支持引擎
S>HOW table status where Engine=’InnoDB ’; 顯示錶狀態信息
Innodb 的延伸版 xtradb
Myisam -------------- aria myisam多用於讀多寫少的場景
InnoDB:InnoBase存儲引擎
數據存儲於「表空間(table space)"中:
(1) 全部數據庫中的全部類型爲InnoDB的表的數據和索引存儲於同一個表空間中;
表空間文件:datadir定義的目錄中文件:ibdata1, ibdata2, ...但這種不支持InnoDB
高級功能
(2) innodb_file_per_table=ON,意味着每表使用單獨的表空間文件;(支持高級功能如單表的導入導出)
每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於本身專用的表空間文件中,並存儲於數據庫目錄下: tbl_name.ibd
如我建立的是數據庫mydata
在/data/mysql下自動建立mydata目錄將數據存放在目錄下 mydata.ibd
表結構的定義:在數據庫目錄,tbl_name.frm
重啓:systemctl restart mysql
這樣建立的表就是一個單獨的表空間在對應的庫中如用的mydb這個庫下存放
特性:
1 是事物引擎但不能大事物,比較適用小事物
2 使用匯集索引:把索引和數據存儲在一處,經過索引能直接找到數據,輔助索引指向彙集索引
3 支持自適應hash索引,用戶不能建立是有mysql自動維護的
4 鎖粒度:行級鎖,間隙鎖
innodb總結:
1數據存儲:表空間;
2併發:MVCC,間隙鎖,行級鎖;
3索引:彙集索引、輔助索引;
4性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
5 備份:支持熱備;
MyISAM:
1支持全文索引(FULLTEXT index)但性能比較差、壓縮、空間函數(GIS);
2不支持事務()
3鎖粒度:表級鎖
4適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);
5文件:每一個表有三個文件,存儲於數據庫目錄中
tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件;
特性:
1加鎖和併發:表級鎖;
2修復:手動或自動修復、但可能會丟失數據;
3索引:非彙集索引;
4延遲索引更新;
5表壓縮;
其它的存儲引擎:
CSV:將CSV文件(以逗號分隔字段的文本文件)做爲MySQL表文件;
MRG_MYISAM:將多個MyISAM表合併成的虛擬表;
BLACKHOLE:相似於/dev/null,不真正存儲數據;
MEMORY:內存存儲引擎,支持hash索引,表級鎖,經常使用於臨時表;
FEDERATED: 用於訪問其它遠程MySQL服務器上表的存儲引擎接口;
SHOW ENGINE Innondb status 查看引擎本身的狀態數據
事物:
併發控制:
鎖:Lock 機制
鎖類型 :
讀鎖:共享鎖,可被多個讀操做共享;
寫鎖:排它鎖,獨佔鎖;
鎖粒度:
表鎖:在表級別施加鎖,併發性較低;每次讀寫都需鎖定整張表
行鎖:在行級別施加鎖,併發性較高;維持鎖狀態的成本較大;
鎖策略:在鎖粒度及數據安全性之間尋求一種平衡機制;
存儲引擎:級別以及什麼時候施加或釋放鎖由存儲引擎自行決定;
MySQL Server:表級別,可自行決定,也容許顯式請求; 顯式鎖
鎖類別:
顯式鎖:用戶手動請求的鎖;
隱式鎖:存儲引擎自行根據須要施加的鎖;
顯式鎖的使用:能夠同時鎖多個
(1) LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES 解鎖
如:use mydb
LOAK TABLE tbl2 read ; 讀鎖是另外一個線程能夠讀不可寫
(2) FLUSH TABLES 刷寫全部表 (把表中數據都寫到磁盤中去,並關閉這個表) 鎖定整個庫
FLUSH TABLES tbl_name,... [WITH READ LOCK];
UNLOCK TABLES; 解鎖
FLUSH TABLES with read lock; 把全部表在緩存中數據都寫入磁盤,並庫中
事務
鎖機制:
1鎖類型:
讀鎖:共享鎖哦能夠被多個讀操做共享
寫鎖:排他鎖,獨佔鎖
2鎖的粒度:
表鎖:在表級別施加鎖,併發性較低;每次讀寫都需鎖定整張表
行鎖:在行級別施加鎖,併發性較高;維持鎖狀態的成本較大;
3鎖策略:在鎖粒度及數據安全性之間尋求一種平衡機制;
存儲引擎:級別以及什麼時候施加或釋放鎖由存儲引擎自行決定 自動的;
MySQL Server(數據庫):表級別,可自行決定,也容許顯式請求; 顯式鎖
4鎖類別:
顯式鎖:用戶手動請求的鎖 ,mysql級別的鎖都是顯示鎖;
隱式鎖:存儲引擎自行根據須要施加的鎖 自動的;
顯式鎖的使用方法:
(1) LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES 解鎖,一下解全部表的鎖
use mydb 用mydb這個庫爲列 >LOcK TABLE tbl2 read ; 讀鎖是另外一個線程能夠讀不可寫 >lock table tabl2 write : >unlock tables: 解鎖
(2) FLUSH TABLES 刷寫全部表 (把表中數據都寫到磁盤中去,並關閉這個表) 鎖定整個庫
>FLUSH TABLES tbl_name with read lock; #把全部表都刷寫一次,並讀鎖
>UNLOCK TABLES; 解鎖
這個命令通常用在備份的時候,把全部表都讀鎖,別人可讀不可寫,這種備份叫溫備
別人不能讀不能寫叫冷備
別人既能夠讀也能夠寫叫熱備
事物:一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工做單元;
如銀行的一個帳戶加,與減, 先後數據要一致的
看是否支持一個事物須要滿住ACID測試
ACID測試:
A:AUTOMICITY,原子性;整個事務中的全部操做要麼所有成功執行,要麼所有失敗後回滾;這都是基於事物日誌進行的
C:CONSISTENCY,一致性;數據庫老是應該從一個一致性狀態轉爲另外一個一致性狀態;
I:ISOLATION,隔離性;一個事務所作出的操做在提交以前,是否能爲其它事務可見;出於保證併發操做之目的,隔離有多種級別; 事物之間隔離,隔離性高低取決於你的風險偏好,
D:DURABILITY,持久性;事務一旦提交,其所作出的修改會永久保存
事物日誌:是磁盤上一段連續的空間
1把修改的操做先放在在日誌中
2 日誌上的記錄會實時的同步到數據文件中
3能夠利用裏面的記錄操做進行回滾
4爲了避免讓在回滾或同步時間太長,通常事務日誌不要太大,不要暫存太多,
5事物日誌都是按組出現的,一組至少2個當第一個寫滿,寫第二個,第一個趕快同步到數據文件中
6 把事務日誌放在有冗餘的磁盤上最好,防止磁盤故障
事務有自動提交和手動提交,最好不要自動提交,容易形成單語句事
通常不建議自動提交事物
>select @@session.auto_commit # 查看自動提交功能 1 爲啓用
Innodb_flush_log_at_trx_commit 1 #表在事務提交後要刷寫日誌,因一個爲自動的每一個語句都是一個事務,每一個語句結束都要刷寫磁盤,這樣io壓力會很大
>Set @@ session.auto_commit=0 修改成手動的,之後啓動事務要手動起了
手動控制事務:
>Start transactiom ; 啓動一個事務
> Insert into tbl2 values (2,’jerry’);
> Update tbl2 set name = ‘Tom’ where id = 1;
>Select * from tbl2;
>Rollback; 滾回事務 每提交前回滾
> Select * from tbl2
>Savepoint first; 設定保存點,方便滾回指定點
> Rollback to first 回滾第一個保護點
>Commit; 提交
事務隔離級別:
READ-UNCOMMITTED:讀未提交 --> 髒讀;隔離級過低 別人沒有提交的數據能夠看到
READ-COMMITTED:讀提交--> 不可重複讀;沒提交以前是不可讀
REPEATABLE-READ:可重複讀 --> 幻讀;在對方提交以前看不到修改的數據,在對方提交以後仍是看不到,只要本身沒有作什麼修改,但本身執行rollback後才能看到
SERIALIZABLE:串行化;當一個沒有提交或回滾以前,是操做阻塞的,只有當多方結束了,才能夠操做
如SELECT @@session.tx_isolation; 查看
SET @@sessio.tx_isolation=’READ-UNCOMMITTED’ 修改級別
兩個用戶分別開啓一個事務,用戶1在修改沒提交,用戶2是能夠看到1的修改的 用戶1 Start transaction; Use mydb Insert into tbl2 values (3,’lucy’) Select * from mydb.tbl2; 用戶2 >start transaction; > Select * from mydb.tbl2;
事務日誌中參數:
Innodb_log_files_in_group # 一組中有幾個文件
Innodb_log_group_home_dir # 事務日誌放哪,通常在數據目錄下 ib_logfile0,ib_logfile1
Innodb_log_file_size #日誌文件多大 ,最好不要太大
Innodb_mirrires_log_groups #鏡像日誌組
> SHOW GLOBAL VARIABLES LIKE ‘innodb%log%’; 查看