1.1 Mysql邏輯架構
mysql各組件協同工作的架構圖
最上層的服務並不是mysql所獨有,大多數基於網絡的客戶端/服務器的工具或者服務都有類似的架構。
大多數mysql的核心服務功能都在第二層,包括查詢解析、分析、優化、緩存以及所有的內置函數,所有的跨存儲引擎的功能都在這一層實現:存儲過程、觸發器、視圖等。
第三層包含存儲引擎。存儲引擎負責mysql中數據的存儲和提取。
1.21 讀寫鎖
讀鎖(read lock)也叫共享鎖(shared lock),該鎖是共享的,多個客戶可以在同一時刻同時讀取一個資源,不互相干擾
寫鎖(write lock)也叫排他鎖(exclusive lock),寫鎖會阻塞其他的寫鎖和讀鎖,在確定的時間裏,只有一個用戶能執行寫入
1.2.2 鎖粒度
一種提高共享資資源併發行的方式是讓鎖定的對象更有選擇性,即是鎖定整張表還是鎖定某行。
表鎖,mysql最基本策略,開銷最小,寫鎖可以插入到鎖隊列中讀鎖的前面
行級鎖,最大程度的支持併發處理
1.3 事務
一組原子性的sql查詢。如果數據庫能成功的對數據庫應用該組查詢的全部語句,則執行該組語句,如果有一條崩潰,則全部不執行。
ACID測試
原子性atomicity、一致性consisitency、隔離性isolation、持久性durability。
原子性
一個事物必須被視爲一個不可分割的最小工作單元。要麼全部執行,要麼全不執行。
一致性
從一個一致性的狀態轉換到另外一個一致性的狀態。
隔離性
一個事務提交之前對其他的事務是不可見的。
持久性
一旦事物提交,對數據庫的修改是永久性的。
1.3.1 隔離級別
1.3.2 死鎖
死鎖是指兩個或者多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,導致惡性循環。多個事務試圖以不同的順序鎖定資源時,也可能產生死鎖。
1.3.3 事務日誌
事務日誌可以幫助事務提高效率。使用事務日誌,存儲引擎在修改表數據的時候只需要修改其內存拷貝,當事務日誌持久以後,內存中被修改的數據以及行爲再被記錄到持久在硬盤上的事務日誌中。
Mysql提供兩種事務型的存儲引擎:InnoDB和NDB Cluster。
通過 SHOW VARTABLES LIKE 'AUTOCOMMIT';獲取數據庫的自動提交默認值。
通過SET AUTOCOMMIT = 1/0;來設置事務的提交模式 1或者ON : 啓用, 0或者OFF : 禁用。
通過SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITED; 來設置隔離級別,mysql支持4個ANSI級別。
1.4 多版本併發控制
MVCC行級鎖的一個變種,大都實現非阻塞讀操作,很多情況下避免加鎖操作,開銷低,寫操作只鎖定必要的行。
在每行記錄最後都有兩行隱藏的版本號,行版本號和行刪除標識。
1.5 mysql的存儲引擎
使用SHOW TABLE STATUS 顯示錶的相關信息。
Name: 表名。
Engine: 存儲引擎類型。
Row_format:行的格式,MyISAM:Dynamic、Fixed、Compressed。Dynamic的行長度是可變的,varchar(),Fixed的行長度固定,char,Commpressed壓縮表中存在
Rows: 表中行數。MyISAM固定值,InnoDB是估計值
Avg_row_length:平均每行包含的字節數
Data_length:表數據的大小(字節爲單位)
Max_data_length:表數據最大容量,和存儲引擎有關
Index_length:索引的大小
Data_free:表已分配但沒有使用的空間
1.5.1 InnoDB 存儲引擎
Mysql的默認事務引擎,也是最重要、使用最廣泛的存儲引擎。用來處理大量的短期(short-lived)事務,短期事務大部分情況下是正常提交的,很少回滾。
數據存儲在表空間(tablespace)中
採用MVCC來支持高併發,實現4個標準的隔離級別
基於聚簇索引建立的,對主鍵查詢有很高的性能。
1.5.2 MyISAM存儲引擎
mysql5.1及之前的版本,MyISAM是默認的存儲引擎,MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM不支持事務很行級鎖,最大的缺陷是崩潰後無法安全修復。對於只讀的數據可以使用MyISAM存儲引擎。
MyISAM將表存儲在兩個文件中:數據文件和索引文件,分別以.MYD和.MYI爲擴展名。MyISAM表可以包含動態或者靜態行。
加鎖與併發: MyISAM對整張表加鎖。但是在表有讀取查詢的同時,允許插入新的記錄。
修復: 可以手工或者自動執行檢查和修復操作,和事務恢復,崩潰恢復不是同一個概念。
索引特性: BLOB和Text等長字段,也可以基於前500個字符創建索引,支持全文檢索
延遲更新索引鍵(delayed key write): 創建MyISAM表的時候,如果指定了DELAY_KEY_WRITE選項,在執行修改完成時,不會立刻修改索引數據到磁盤,存到內存中的鍵緩衝區(in-memory key buffer),在清理鍵緩衝區的時候纔將對應的索引塊寫入到磁盤,崩潰時索引損壞,可以全局設置,也可以單表設置。
MyISAM壓縮表
創建表之後不再進行修改操作,適合採用壓縮表。
MyISAM性能
MyISAM引擎設計簡單,數據以緊密格式存儲,在某些場景下性能很好。有一些服務器級別的性能擴展限制,對索引鍵緩衝區的Mutex鎖,最大的性能問題是表鎖的問題。
1.5.6 轉換表的引擎
ALTER TABLE
ALTER TABLE mytable ENGINE = InnoDB;
執行時間長,Mysql會將數據從原表複製到一張新表中。
InnoDB -- > MyISAM -- > InnoDB 原InnoDB表上所有的外鍵消失。
導入與導出
使用mysqldump,容易數據丟失
創建與查詢