1. Mysql架構
1.1. 體系
1.1.1. 連接層
當MySQL啟動(MySQL服務器就是一個進程),等待客戶端連接,每一個客戶端連接請求,服務器都會新建一個線程處理(如果是線程池的話,則是分配一個空的線程),每個線程獨立,擁有各自的內存處理空間
show VARIABLES like '%max_connections%'
連接到服務器,服務器需要對其進行驗證,也就是用戶名、IP、密碼驗證,一旦連接成功,還要驗證是否具有執行某個特定查詢的權限(例如,是否允許客戶端對某個數據庫某個表的某個操作)
1.1.2. SQL處理層
這一層主要功能有:SQL語句的解析、優化,緩存的查詢,MySQL內置函數的實現,跨存儲引擎功能(所謂跨存儲引擎就是說每個引擎都需提供的功能(引擎需對外提供接口)),例如:存儲過程、觸發器、視圖等。
1.如果是查詢語句(select語句),首先會查詢緩存是否已有相應結果,有則返回結果,無則進行下一步(如果不是查詢語句,同樣調到下一步)
2.解析查詢,創建一個內部數據結構(解析樹),這個解析樹主要用來SQL語句的語義與語法解析;
3.優化:優化SQL語句,例如重寫查詢,決定表的讀取順序,以及選擇需要的索引等。這一階段用戶是可以查詢的,查詢服務器優化器是如何進行優化的,便於用戶重構查詢和修改相關配置,達到最優化。這一階段還涉及到存儲引擎,優化器會詢問存儲引擎,比如某個操作的開銷信息、是否對特定索引有查詢優化等。
1.1.2.1. 緩存
show variables like '%query_cache_type%' -- 默認不開啟
show variables like '%query_cache_size%' --默認值1M
SET GLOBAL query_cache_type = 1; --會報錯
query_cache_type只能配置在my.cnf文件中,這大大限制了qc的作用
在生產環境建議不開啟,除非經常有sql完全一模一樣的查詢
QC嚴格要求2次SQL請求要完全一樣,包括SQL語句,連接的數據庫、協議版本、字符集等因素都會影響
1.1.2.2. 解析查詢
1.1.2.3. 優化
通過上面的sql大概就能看出一個sql並不一定會去查詢物理數據,sql解析器會通過優化器來優化程序員寫的sql
explain
select * from account t where t.id in (select t2.id from account t2)
show warnings;
1.2. 邏輯架構
在mysql中其實還有個schema的概念,這概念沒什么太多作用,只是為了兼容其他數據庫,所以也提出了這個。
在mysql中 database 和schema是等價的
create database demo;
show databases;
drop schema demo;
show databases;
1.3. 物理存儲結構
1.3.1. 數據庫的數據庫(DataDir)
mysql安裝的時候都要指定datadir,其查看方式為:
show VARIABLES like 'datadir',其規定所有建立的數據庫存放位置
1.3.2. 數據庫
創建了一個數據庫后,會在上面的datadir目錄新建一個子文件夾
1.3.3. 表文件
用戶建立的表都會在上面的目錄中,它和具體的存儲引擎相關,但有個共同的就是都有個frm文件,它存放的是表的數據格式。
mysqlfrm --diagnostic /usr/local/mysql/data/mall/account.frm
1.3.4. mysql utilities 安裝
tar -zxvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5
python ./setup.py build
python ./setup.py install