MySql歷史與架構

MySQL 邏輯架構

連接管理與安全性

每個客戶端連接都會有一個線程
認證基於用戶名,原始主機信息和密碼

優化與執行

Mysql會解析查詢並進行優化
對於select會先檢查查詢緩存,能夠找到就直接返回結果集

並發控制

讀寫鎖

鎖在COMMIT或ROLLBACK時自動釋放

讀鎖(共享鎖)

共享,不阻塞,多個用戶可以同時讀同一個資源

寫鎖(獨佔鎖)

保證只有一個用戶寫入,防止其他用戶寫入或讀取數據

鎖粒度

加鎖,鎖的檢查,鎖的解除都是要消耗系統資源的
加鎖的對象大小成為鎖粒度

鎖策略

在鎖的開銷與數據的安全性中尋求平衡

行鎖

最大程度支持並發,MySQL服務器層沒有實現,由存儲引擎實現

表鎖

開銷最小
MySQL服務器可以根據自己的目的加上表鎖而忽略存儲引擎的鎖機制

事務

一組原子性的SQL語句,要麼全部執行,要麼全部不執行
ACID
  1. 原子性: 要麼全部執行,要麼全部不執行
  2. 一致性: 狀態的改變是完全的,不存在改變一半就被保存的情況
  3. 隔離性: 在提交前對其他事務不可見
  4. 持久性: 數據更改會永遠保存

隔離級別

未提交讀(Read Uncommited)

即使事務未曾提交,數據對於其他事務也是可見的.即事務可以讀取未提交的數據,也叫臟讀讀臟數據

可提交讀

即一個事務在提交之前,改變對其他事務是不可見的,又叫不可重複讀,幻讀(在一個事務讀取數據後還未提交時,另一個事務更改了數據)

可重複讀

解決了幻讀和臟讀的問題

可串行化

強制事務串行執行,給每一行數據加鎖

死鎖

死鎖指兩個或多個事務在同一個資源上相互佔用,並請求鎖定對方佔用的資源,從而造成的惡性循環
死鎖發生後,只能通過部分或完全回滾事務才能解決
例子

事務日誌

好處

  1. 避免頻繁從內存向磁盤中寫入數據(可以記錄下日誌操作,在後台慢慢一次寫入,所以日誌文件是追加寫)
  2. 便於出現故障後的恢復

Mysql中的事務

自動提交(AUTOCOMMIT)

混合使用多種存儲引擎

InnoDB: 支持事務
MyISAM: 不支持事務
不支持事務的表回滾不能撤銷更改

隱式和顯式鎖定

顯式: 自動加鎖
隱式: 主動加鎖

多版本並發控制(MVCC)

  • 一個列保存了創建時間,一個列保存刪除時間(時間指版本號)
  • 每開始一個新的事務,系統版本號都會遞增,並把事務開始時的版本號作為事務的版本號,供與查詢到的每行版本號相匹配

MySql存儲引擎

  • 表的定義存儲在.frm文件中
  • 通過show table status ‘tableName’查看錶的相關定義信息

InnoDB

是MySql的默認事務型引擎,也是使用最廣泛的存儲引擎,被設計用來處理大量短期事務
  • 數據存儲在表空間中
  • 採用MVCC實現並發,實現四種隔離級別,默認可重複讀
  • 基於聚簇索引(第二索引必須包含主鍵)建立

MyISAM

缺點

  1. 不支持事務和行級鎖
  2. 數據庫崩潰後無法安全恢復

特性

  1. 對整張表加鎖,而不是針對行,但在讀取數據的時候依然可以插入新的數據(並發插入)
  2. 延遲更新索引鍵

其他引擎

CSV

用於轉化.csv文件成數據庫里的表

Memory

Archive

第三方引擎

選擇合適的引擎

除非用到某些InnoDB不具備的特性,並且沒有其他辦法可以替代,否則都應該優先選擇InnoDB引擎
最好不要混用多種存儲引擎!!!

更換表的引擎

ALTER TABLE

ALTER Table name Engine = InnoDB

導入與導出

創建與查詢

 
 
 
 
 
 
 
Tags: