MySQL高級(2) 邏輯架構
文章目錄
MySQL邏輯架構
邏輯架構的介紹
連接層
最上層是一些客戶端和連接服務,包含本地sock通信和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通信。主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,爲通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。服務器也會爲安全接入的每個客戶端驗證它所具有的操作權限。
服務層
最上層是一些客戶端和連接服務,包含本地sock通信和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通信。主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,爲通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。服務器也會爲安全接入的每個客戶端驗證它所具有的操作權限。
引擎層
存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。常用的存儲引擎有MyISAM和InnoDB.
說明
和其他數據庫相比, MySQL是插件式的存儲引擎架構, 也就是說可以根據應用場景的不同更換存儲引擎, 所以MySQL可以在多種不同場景中應用併發揮良好的作用
查看存儲引擎
show engines;
查看當前存儲引擎
show variables like '%storage_engine%'
MyISAM和InnoDB的區別
MyISAM | InnoDB | |
---|---|---|
主外鍵(一般不用) | × | √ |
事務 | × | √ |
鎖 | 表鎖(不適合高併發) | 行鎖(適合高併發) |
緩存 | 只緩存索引, 不緩存真實數據 | 索引和真實數據都返回, 對內存要求較高 |
表空間 | 小 | 大 |
關注點 | 性能 | 事務 |
常見的數據庫引擎介紹
- MyISAM*
管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置裏被支持,它是默認的存儲引擎,除非你配置MySQL默認使用另外一個引擎。
- MEMORY
存儲引擎提供“內存中”表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作爲一個單獨的表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務表,這兩個引擎也都被默認包含在MySQL中。
- InnoDB和BDB
存儲引擎提供事務安全表。BDB被包含在爲支持它的操作系統發佈的MySQL-Max二進制分發版裏。InnoDB也默認被包括在所 有MySQL 5.1二進制分發版裏,你可以按照喜好通過配置MySQL來允許或禁止任一引擎。
- EXAMPLE
存儲引擎是一個“存根”引擎,它不做什麼。你可以用這個引擎創建表,但沒有數據被存儲於其中或從其中檢索。這個引擎的目的是服務,在 MySQL源代碼中的一個例子,它演示說明如何開始編寫新存儲引擎。同樣,它的主要興趣是對開發者。
- NDB Cluster
是被MySQL Cluster用來實現分割到多臺計算機上的表的存儲引擎。它在MySQL-Max 5.1二進制分發版裏提供。這個存儲引擎當前只被Linux, Solaris, 和Mac OS X 支持。在未來的MySQL分發版中,我們想要添加其它平臺對這個引擎的支持,包括Windows。
- ARCHIVE
存儲引擎被用來無索引地,非常小地覆蓋存儲的大量數據。
- CSV
存儲引擎把數據以逗號分隔的格式存儲在文本文件中。
- BLACKHOLE
存儲引擎接受但不存儲數據,並且檢索總是返回一個空集。
- FEDERATED
存儲引擎把數據存在遠程數據庫中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未來的分發版中,我們想要讓它使用其它驅動器或客戶端連接方法連接到另外的數據源。
數據存儲層
主要是將數據存儲在運行於設備的文件系統之上, 並完成與存儲引擎的交互
SQL語句的在MySQL架中的執行順序
- 首先訪問連接池
- 訪問緩存區讀)或緩衝區(寫), 如果訪問成功(命中), 如果訪問失敗, 就繼續進行下一步(需要在配置文件中啓用緩存, 如果沒有啓用緩存, 將直接對磁盤進行讀寫)
- SQL接口
- 解析器, 解析SQL語句, 將SQL語序解析成計算機執行的順序
- 優化器, 在優化器生成執行計劃
- 存儲引擎開始執行操作
- 更新緩衝區
- 返回執行結果
寫SQL語句時的順序
select distinct <查詢列表>
from
<表1> (inner|left|right) join <表2>
on <關聯條件>
where <查詢條件>
group by <分組條件>
having <having 條件>
order by <排序條件>
limit <範圍>
計算機讀取SQL的順序(SQL語句被解析器解析後的順序)
from <表1>
on <關聯條件>
(inner|left|right) join <表2>
where <查詢條件>
group by <分組條件>
having <having 條件>
select distinct <查詢列表>
order by <排序條件>
limit <範圍>