1. 程式人生 > 資料庫 >07-MySQL 架構介紹

07-MySQL 架構介紹

MySQL 邏輯架構

MySQL 與其他資料相比, 最與眾不同的點在於:它的架構可以在多種不同場景中應用併發揮良好作用, 最主要提現在儲存引擎的架構上。外掛式的儲存引擎架構將查詢處理和其他的系統任務以及資料的儲存提取相分離,這種架構可以根據業務的需求和實際需要選擇合適的儲存引擎。

整個 MySQL Server 由以下組成:

  • Connection Pool:連線池元件
  • Management Services & Utilities:管理服務和工具元件
  • SQL Interface:SQL介面元件
  • Parser:查詢分析器元件
  • Optimizer:優化器元件
  • Caches & Buffers:緩衝池元件
  • Pluggable Storage Engines:儲存引擎
  • File System:檔案系統

連線層

最上層是一些客戶端和連結服務, 包含本地 Socket 通訊和大多數基於客戶端/服務端工具實現的 TCP/IP 的通訊。主要完成一些類似於連線處理、授權認證及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於 SSL 的安全連結。伺服器也會為安全接入的每個客戶端驗證它所具有的操作許可權。

服務層

在此層中完成了大多的核心服務功能。

  • SQL Interface:接受使用者的 SQL 語句, 並且返回使用者需要查詢的結果
  • Parser:解析器, 區分 SQL 語句的型別, 轉發給對應的處理模組
  • Optimizer:查詢優化器, 在執行查詢 SQL 之前會使用查詢優化器進行優化, 如 SQL 的執行順序、是否使用索引等。
  • 其他:所有跨儲存引擎的功能也是在這一層實現的,如儲存過程、函式就在該層解析執行。

【查詢說明】在該層,伺服器會解析查詢並建立相應的內部解析樹,並對其完成相應的優化,如:確定查詢表的順序,是否利用索引等,最後生成相應的執行操作。如果是 SELECT 語句,伺服器還會查詢內部的快取。如果快取空間足夠大,那麼在解決大量讀操作的環境中就能夠很好的提升系統的效能。

引擎層

儲存引擎層真正負責 MySQL 中資料的儲存和提取, 伺服器通過 API 與儲存引擎進行通訊, 不同的儲存引擎具有的功能不同, 可以根據業務來選擇具體的儲存引擎。常用的儲存引擎有兩種:MylSAM 和 InnoDB。

儲存層

資料儲存層主要是將資料儲存在執行與裸裝置的檔案系統之上, 並完成與儲存引擎的互動。

主要配置檔案

MySQL 儲存引擎

概述

和大多數的資料庫不同,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

InnoDB 儲存引擎是 MySQL 的預設儲存引擎。InnoDB 儲存引擎提供了具有提交、回滾、崩潰恢復能力的事務安全。但是對比 MyISAM 的儲存引擎,InnoDB 寫的處理效率差一些,並且會佔用更多的磁碟空間以保留資料和索引。

InnoDB 儲存引擎不同於其他儲存引擎的特點:事務控制、外來鍵約束、儲存方式。


外來鍵約束

  • MySQL支援外來鍵的儲存引擎只有 InnoDB,在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候, 也會自動的建立對應的索引。
  • 在建立索引時,可以指定在刪除、更新父表時,對子表進行的相應操作,包括 RESTRICT、CASCADE、SET NULL 和 NO ACTION。
    • RESTRICT 和 NO ACTION 相同,是指限制在子表有關聯記錄的情況下,父表不能更新;
    • CASCADE 表示父表在更新或者刪除時,更新或者刪除子表對應的記錄;
    • SET NULL 則表示父表在更新或者刪除的時候,子表的對應欄位被 SET NULL 。
  • 針對有外來鍵關係的兩個表,若子表的外來鍵指定是 ON DELETE RESTRICT / ON UPDATE CASCADE 方式, 那麼在主表刪除記錄的時候,如果子表有對應記錄,則不允許刪除,主表在更新記錄的時候,如果子表有對應記錄,則子表對應更新。

InnoDB 儲存表和索引有以下兩種方式:

  • 使用共享表空間儲存, 這種方式建立的表的表結構儲存在 .frm 檔案中,資料和索引儲存在 innodb_data_home_dir 和 innodb_data_file_path 定義的表空間中,可以是多個檔案。
  • 使用多表空間儲存, 這種方式建立的表的表結構仍然存在 .frm 檔案中,但是每個表的資料和索引單獨儲存在 .ibd 中。

MyISAM

MyISAM 不支援事務、也不支援外來鍵,其優勢是訪問的速度快,對事務的完整性沒有要求或者以 SELECT、INSERT 為主的應用基本上都可以使用這個引擎來建立表。


有以下 2 個比較重要的特點:

  • 不支援事務
  • 檔案儲存方式:每個 MyISAM 在磁碟上儲存成 3 個檔案,其檔名都和表名相同,但拓展名分別是 .frm (儲存表定義)、.MYD (MYData,儲存資料)、.MYI (MYIndex,儲存索引)。

MyISAM 和 InnoDB

MEMORY

Memory 儲存引擎將表的資料存放在記憶體中。每個 MEMORY 表實際對應一個磁碟檔案,格式是 .frm,該檔案中只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於資料的快速處理,提高整個表的效率。MEMORY 型別的表訪問非常地快,因為他的資料是存放在記憶體中的,並且預設使用 HASH 索引,但是服務一旦關閉,表中的資料就會丟失。

MERGE

MERGE 儲存引擎是一組 MyISAM 表的組合,這些 MyISAM 表必須結構完全相同,MERGE 表本身並沒有儲存資料,對 MERGE 型別的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的 MyISAM 表進行的。

對於 MERGE 型別表的插入操作,是通過 INSERT_METHOD 子句定義插入的表,可以有 3 個不同的值,使用 FIRST 或 LAST 值使得插入操作被相應地作用在第一或者最後一個表上,不定義這個子句或者定義為 NO,表示不能對這個 MERGE 表執行插入操作。

可以對 MERGE 表進行 DROP 操作,但是這個操作只是刪除 MERGE 表的定義,對內部的表是沒有任何影響的。

儲存引擎的選擇

在選擇儲存引擎時,應該根據應用系統的特點選擇合適的儲存引擎。對於複雜的應用系統,還可以根據實際情況選擇多種儲存引擎進行組合。以下是幾種常用的儲存引擎的使用環境。

  • InnoDB:是 MySQL 的預設儲存引擎,用於事務處理應用程式,支援外來鍵。如果應用對事務的完整性有比較高的要求,在併發條件下要求資料的一致性,資料操作除了插入和查詢意外,還包含很多的更新、刪除操作,那麼 InnoDB 儲存引擎是比較合適的選擇。InnoDB 儲存引擎除了有效的降低由於刪除和更新導致的鎖定, 還可以確保事務的完整提交和回滾,對於類似於計費系統或者財務系統等對資料準確性要求比較高的系統,InnoDB 是最合適的選擇。
  • MyISAM:如果應用是以讀操作和插入操作為主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇這個儲存引擎是非常合適的。
  • MEMORY:將所有資料儲存在 RAM 中,在需要快速定位記錄和其他類似資料環境下,可以提供幾塊的訪問。MEMORY 的缺陷就是對錶的大小有限制,太大的表無法快取在記憶體中,其次是要確保表的資料可以恢復,資料庫異常終止後表中的資料是可以恢復的。MEMORY 表通常用於更新不太頻繁的小表,用以快速得到訪問結果。
  • MERGE:用於將一系列等同的 MyISAM 表以邏輯方式組合在一起,並作為一個物件引用他們。MERGE 表的優點在於可以突破對單個 MyISAM 表的大小限制,並且通過將不同的表分佈在多個磁碟上,可以有效的改善 MERGE 表的訪問效率。這對於儲存諸如資料倉儲等 VLDB 環境十分合適。

查詢的執行路徑

  1. 客戶端將查詢傳送到伺服器。
  2. 伺服器檢查查詢快取。如果找到了,就從快取中返回結果,否則進行下一步。
  3. 伺服器解析,預處理和優化查詢,生成執行計劃。
  4. 執行引擎呼叫儲存引擎 API 執行查詢。
  5. 伺服器將結果傳送回客戶端。