MySQL高級(一)、MySQL邏輯架構、存儲引擎與JOIN理論

一、MySQL的邏輯架構

MySQL邏輯架構圖
在這裏插入圖片描述
和其它數據庫相比,MySQL有點與衆不同,它的架構可以在多種不同場景中應用併發揮良好作用。主要體現在存儲引擎的架構上,插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構可以根據業務的需求和實際需要選擇合適的存儲引擎。

MySQL的邏輯架構主要分爲以下四層。

1.連接層

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

2.服務層

  1. Management Serveices & Utilities:系統管理和控制工具
  2. SQL Interface: SQL接口
    接受用戶的SQL命令,並且返回用戶需要查詢的結果。比如select from就是調用SQL Interface
  3. Parser: 解析器
    SQL命令傳遞到解析器的時候會被解析器驗證和解析。
  4. Optimizer: 查詢優化器
    SQL語句在查詢之前會使用查詢優化器對查詢進行優化。
    用一個例子就可以理解: select uid,name from user where gender= 1;
    優化器來決定先投影還是先過濾。
  5. Cache和Buffer: 查詢緩存
    如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。
    這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等
    緩存是負責讀,緩衝負責寫。

3.引擎層

存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。後面介紹MyISAM和InnoDB。

4.存儲層

數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。

二、MySQL存儲引擎

查看存儲引擎命令

show engines;

在這裏插入圖片描述
可以看到MySQL的存儲引擎情況如上所示,其中主要的兩種引擎爲InnoDB和MyISAM
也可通過以下命令查看存儲引擎情況,可以看到默認的存儲引擎爲InnoDB

show variables like '%storage_engine%';

在這裏插入圖片描述

InnoDB和MyISAM的對比

在這裏插入圖片描述
通過上圖的對比,可以看到兩種存儲引擎的區別主要在於對主外鍵的支持、對事務的支持、行表鎖以及緩存的區別。
在這裏插入圖片描述

擴展視野:阿里巴巴的選擇

  • Percona 爲 MySQL 數據庫服務器進行了改進,在功能和性能上較 MySQL 有着很顯著的提升。該版本提升了在高負載情況下的 InnoDB 的性能、爲 DBA 提供一些非常有用的性能診斷工具;另外有更多的參數和命令來控制服務器行爲。
  • 該公司新建了一款存儲引擎叫xtradb完全可以替代innodb,並且在性能和併發上做得更好,
  • 阿里巴巴大部分mysql數據庫其實使用的percona的原型加以修改。
  • 阿里提出了:AliSql+AliRedis

三、JOIN理論

七種連接查詢圖解

在這裏插入圖片描述
以上各圖在基礎篇已經看到過了,下面簡單解釋一下:
圖1:查詢A表所有,若A表中的key在B表中找不到與之對應的key時,仍然顯示,B表的用null填充;若A表的key在B表有多條記錄與之對應,則A表的記錄重複顯示。
圖2:查詢B表所有,與圖1相對,若B表中的key在A表中找不到與之對應的key時,仍然顯示,A表用null填充;若B表的key在A表有多條記錄與之對應,則B表的記錄重複顯示。
圖3:A表與B表內連接,查詢兩表的交集部分。
圖4:查詢A表獨有,在圖1的基礎上加上篩選條件B的key爲空,這樣就排除了A和B的交集部分,以及B的獨有部分。
圖5:與圖4相對,查詢B表獨有,在圖2的基礎上加上篩選條件A的key爲空,這樣就排除了A和B的交集,以及A的獨有部分。
圖6:A和B的全連接,查詢兩表的並集。全連接full outer join 在mysql中不支持,但可以通過連接查詢來實現。
圖7:查詢A的獨有以及B的獨有。

案例:A表和B表分別對應t_dept部門表與t_emp員工表,兩表的記錄情況如下圖。
在這裏插入圖片描述
圖1情況:

select * from t_dept d left outer join t_emp e on d.id = e.deptId;

在這裏插入圖片描述
圖2情況:

select * from t_dept d right outer join t_emp e on d.id = e.deptId;

在這裏插入圖片描述
圖3情況:

select * from t_dept d join t_emp e on d.id = e.deptId;

在這裏插入圖片描述
圖4情況:

select * from t_dept d left outer join t_emp e on d.id = e.deptId where e.deptId is null;

在這裏插入圖片描述
圖5情況:

select * from t_dept d right outer join t_emp e on d.id = e.deptId where d.id is null;

在這裏插入圖片描述
圖6情況:

select * from t_dept d left outer join t_emp e on d.id = e.deptId 
union 
select * from t_dept d right outer join t_emp e on d.id = e.deptId;

在這裏插入圖片描述
圖7情況:

select * from t_dept d left outer join t_emp e on d.id = e.deptId where e.deptId is null 
union 
select * from t_dept d right outer join t_emp e on d.id = e.deptId where d.id is null;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章