mysql 與其他資料相比, 最與眾不同的點在於:它的架構可以在多種不同場景中應用並發揮良好作用, 最主要提現在儲存引擎的架構上。外掛程式式的儲存引擎架構將查詢處理和其他的系統任務以及資料的儲存提取相分離,這種架構可以根據業務的需求和實際需要選擇合適的儲存引擎。
整個 mysql server 由以下組成:
最上層是一些客戶端和鏈結服務, 包含本地 socket 通訊和大多數基於客戶端/服務端工具實現的 tcp/ip 的通訊。主要完成一些類似於連線處理、授權認證及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於 ssl 的安全鏈結。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。
在此層中完成了大多的核心服務功能。
【查詢說明】在該層,伺服器會解析查詢並建立相應的內部解析樹,並對其完成相應的優化,如:確定查詢表的順序,是否利用索引等,最後生成相應的執行操作。如果是 select 語句,伺服器還會查詢內部的快取。如果快取空間足夠大,那麼在解決大量讀操作的環境中就能夠很好的提公升系統的效能。
儲存引擎層真正負責 mysql 中資料的儲存和提取, 伺服器通過 api 與儲存引擎進行通訊, 不同的儲存引擎具有的功能不同, 可以根據業務來選擇具體的儲存引擎。常用的儲存引擎有兩種:mylsam 和 innodb。
資料儲存層主要是將資料儲存在執行與裸裝置的檔案系統之上, 並完成與儲存引擎的互動。
和大多數的資料庫不同,mysql中有乙個儲存引擎的概念,針對不同的儲存需求可以選擇最優的儲存引擎。
儲存引擎就是儲存資料、建立索引、更新查詢資料等等技術的實現方式。儲存引擎是基於表的,而不是基於庫的,所以儲存引擎也可被稱為表型別。
oracle,sql server 等資料庫只有一種儲存引擎。mysql 提供了外掛程式式的儲存引擎架構,所以 mysql 存在多種儲存
引擎,可以根據需要使用相應引擎,或者編寫儲存引擎。
mysql 5.0 支援的儲存引擎包含:innodb、myisam、bdb、memory、merge、example、ndb cluster、archive、csv、blackhole、federated 等,其中 innodb 和 bdb 提供事務安全表,其他儲存引擎是非事務安全表。
檢視 mysql 提供什麼儲存引擎:show engines;
檢視 mysql 當前預設的儲存引擎:show variables like "%storage_engine%";
建立新錶時如果不指定儲存引擎,那麼系統就會使用預設的儲存引擎,mysql 5.5 之前的預設儲存引擎是 myisam,5.5 之後就改為了 innodb。
下面重點介紹幾種常用的儲存引擎,並對比各個儲存引擎之間的區別,如下表所示:
innodb 儲存引擎是 mysql 的預設儲存引擎。innodb 儲存引擎提供了具有提交、回滾、崩潰恢復能力的事務安全。但是對比 myisam 的儲存引擎,innodb 寫的處理效率差一些,並且會占用更多的磁碟空間以保留資料和索引。
innodb 儲存引擎不同於其他儲存引擎的特點:事務控制、外來鍵約束、儲存方式。
外來鍵約束
針對有外來鍵關係的兩個表,若子表的外來鍵指定是 on delete restrict / on update cascade 方式, 那麼在主表刪除記錄的時候,如果子表有對應記錄,則不允許刪除,主表在更新記錄的時候,如果子表有對應記錄,則子表對應更新。
innodb 儲存表和索引有以下兩種方式:
myisam
myisam 不支援事務、也不支援外來鍵,其優勢是訪問的速度快,對事務的完整性沒有要求或者以 select、insert 為主的應用基本上都可以使用這個引擎來建立表。
有以下 2 個比較重要的特點:
myisam 和 innodb
memory 儲存引擎將表的資料存放在記憶體中。每個 memory 表實際對應乙個磁碟檔案,格式是.frm
,該檔案中只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於資料的快速處理,提高整個表的效率。memory 型別的表訪問非常地快,因為他的資料是存放在記憶體中的,並且預設使用 hash 索引,但是服務一旦關閉,表中的資料就會丟失。
merge
merge 儲存引擎是一組 myisam 表的組合,這些 myisam 表必須結構完全相同,merge 表本身並沒有儲存資料,對 merge 型別的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的 myisam 表進行的。
對於 merge 型別表的插入操作,是通過 insert_method 子句定義插入的表,可以有 3 個不同的值,使用 first 或 last 值使得插入操作被相應地作用在第一或者最後乙個表上,不定義這個子句或者定義為 no,表示不能對這個 merge 表執行插入操作。
可以對 merge 表進行 drop 操作,但是這個操作只是刪除 merge 表的定義,對內部的表是沒有任何影響的。
在選擇儲存引擎時,應該根據應用系統的特點擊擇合適的儲存引擎。對於複雜的應用系統,還可以根據實際情況選擇多種儲存引擎進行組合。以下是幾種常用的儲存引擎的使用環境。
客戶端將查詢傳送到伺服器。
伺服器檢查查詢快取。如果找到了,就從快取中返回結果,否則進行下一步。
伺服器解析,預處理和優化查詢,生成執行計畫。
執行引擎呼叫儲存引擎 api 執行查詢。
伺服器將結果傳送回客戶端。
07 MySQL常用內建函式
常用函式 1.字串函式 concat str1,str2,strn 將str1,str2.strn 拼接成乙個字串,當這裡有任何乙個為null,則拼接結果為null insert str,idx,len,tarstr 將字串str從 idx 位置開始,len個字元長度的子串替換為字串tarstr.l...
07 mysql 多表查詢 連線查詢
每個資料庫中可以存放多張表,真正的應用中經常需要從多個資料表中讀取資料 笛卡爾乘積 多表進行連線查詢時沒有任何條件,最終的結果是多表結果數量乘積的現象被稱為笛卡爾積 例如 select e.employeename,d.departmentname from department as d,empl...
07 MySQL 時間日期型別
日期型別 系統使用三個位元組來儲存資料,對應的格式為 yyyy mm dd,能表示的範圍是從1000 01 01 到9999 12 12,初始值為0000 00 00 時間型別 能夠表示某個指定的時間,但是系統同樣是提供3個位元組來儲存,對應的格式為 hh ii ss,但是mysql中的time型別...