咱們先下圖看看MySQL總體邏輯架構(MySQL’s Logical Architecture)mysql
圖1 sql
第一層,即最上一層,所包含的服務並非MySQL所獨有的技術。它們都是服務於C/S程序或者是這些程序所須要的 :鏈接處理,身份驗證,安全性等等。數據庫
第二層值得關注。這是MySQL的核心部分。一般叫作 SQL Layer。在 MySQL據庫系統處理底層數據以前的全部工做都是在這一層完成的,包括權限判斷, sql解析,行計劃優化, query cache 的處理以及全部內置的函數(如日期,時間,數學運算,加密)等等。各個存儲引擎提供的功能都集中在這一層,如存儲過程,觸發器,視 圖等。緩存
第三層包括了存儲引擎。一般叫作StorEngine Layer ,也就是底層數據存取操做實現部分,由多種存儲引擎共同組成。它們負責存儲和獲取全部存儲在MySQL中的數據。就像Linux衆多的文件系統 同樣。每一個存儲引擎都有本身的優勢和缺陷。服務器是經過存儲引擎API來與它們交互的。這個接口隱藏 了各個存儲引擎不一樣的地方。對於查詢層儘量的透明。這個API包含了不少底層的操做。如開始一個事 物,或者取出有特定主鍵的行。存儲引擎不能解析SQL,互相之間也不能通訊。僅僅是簡單的響應服務器 的請求。安全
鏈接管理和安全服務器
在服務器內部,每一個client鏈接都有本身的線程。這個鏈接的查詢都在一個單獨的線程中執行。這些線程輪流運行在某一個CPU內核(多核CPU)或者CPU中。服務器緩存了線程,所以不須要爲每一個client鏈接單首創建和銷燬線程 。數據結構
當clients(也就是應用程序)鏈接到了MySQL服務器。服務器須要對它進行認證(Authenticate)。認證是基於用戶名,主機,以及密碼。對於使用了SSL(安全套接字層)的鏈接,還使用了X.509證書。clients一鏈接上,服務器就驗證它的權限 (如是否容許客戶端能夠查詢world數據庫下的Country表的數據)。架構
優化和執行併發
MySQL會解析查詢,並建立了一個內部數據結構(解析樹)。而後對其進行各類優化。這些優化包括了,查詢語句的重寫,讀表的順序,索引的選擇等等。用戶能夠經過查詢語句的關鍵詞傳遞給優化器以便提示使用哪一種優化方式,這樣即影響了優化器的優化方式。另外,用戶也能夠請求服務器給出優化過程的各類說明,以獲知服務器的優化策略,爲用戶提供了參數基準,以便用戶能夠重寫查詢,架構和修改相關服務器配置,便於mysql更高效的運行。函數
優化器並是不關心表使用了哪一種存儲引擎,可是存儲引擎對服務器優化查詢的方式是有影響的。優化器須要知道存儲引擎的一些特性:具體操做的性能和開銷方面的信息,以及表內數據的統計信息。例如,存儲引擎支持哪些索引類型,這對於查詢是很是有用的。
在解析查詢以前,要查詢緩存,這個緩存只能保存查詢信息以及結果數據。若是請求一個查詢在緩存 中存在,就不須要解析,優化和執行查詢了。直接返回緩存中所存放的這個查詢的結果。
(1)MySQL能夠將數據以不一樣的技術存儲在文件(內存)中,這種技術就成爲存儲引擎。
每種存數引擎使用不一樣的存儲機制、索引技巧、鎖定水平,最終提供普遍且不一樣的功能。
(2)使用不一樣的存儲引擎也能夠說不一樣類型的表
(3)MySQL支持的存儲引擎
1. MyISAM
2. InnoDB
3. Memory
4. CSV
5. Archive
併發控制:
(1)當多個鏈接對記錄進行修改時保證數據的一致性和完整。
(2)
1. 共享鎖(讀鎖) : 在同一段時間段內,多個用戶能夠讀取同一個資源,讀取過程當中數據不會發生任何變化
2. 排他鎖(寫鎖) :在任什麼時候候只能有一個用戶寫入資源,當進入寫鎖時會阻塞其餘的讀鎖或者寫鎖操做。
鎖顆粒:
表鎖:是一種開銷最小的鎖策略
行鎖:是一種開銷最大的鎖策略,能提供最大的併發操做
事務處理:整個過程每個單元所有完成纔算事務處理成功,某一個單元失敗事務就會回滾.
主要做用:保證數據庫的完整性
事務的特性:
原子性、一致性、隔離性、持久性
簡稱:A(Atomic)C(Consistency)I(Isolation)D(Durable)
四種隔離級別:
未提交讀(read uncommited):事務中修改,即便沒有提交,其餘事務也是可見的--髒讀
提交讀(read commited):一個事務開始時只能看到已經提交的修改,事務從開始到提交以前,所做的改動其餘事務不可見--不可重複讀
可重複讀(repeated read):同一個事務中屢次讀取一樣記錄結果一致--幻讀
可串行化(serializable):加鎖強制事務串行化-爭鎖,超時
索引:相似目錄,是對數據表中一列或多列的值進行排序的一種結構,方便快速查找到數據
使用最多的:MyISAM,InnoDB
CSV存儲引擎:以逗號爲分隔符,不支持索引;
BlackHole:黑洞引擎,寫入的數據都會消失,通常用於作數據複製的中繼;
MyISAM:適用於事務的處理很少的狀況;
InnoDB:適用於事務處理比較多,須要有外鍵支持的狀況。
從大部分狀況innodb是合適的
1,若是須要事務支持,那麼innodb是最穩定的,若是不須要,主要是select和insert用myisam,通常日誌應用使用
2,如能夠按期關閉服務備份,備份因素不考慮,不然使用innodb,支持在線熱備份
3,myisam崩潰後損壞概率大,innodb恢復速度快
4,特有性質:如只有myisam支持地理空間搜索
(1)經過修改MySQL配置文件實現 default-storage-engine = engine (2)經過建立數據表命令實現 CREATE TABLE table_name(\ ... ) ENGINE = engine; (3)經過修改數據表命令實現 ALTER TABLE table_name ENGINE [=] engine_name; 例如: ALTER TABLE tp1 ENGINE = InnoDB;