MySQL優化--邏輯架構介紹及其存儲引擎

1.邏輯架構介紹

和其他數據庫相比,MySQL有點與衆不同,它的架構可以在多種不同場景中應用併發揮良好作用。主要體現在存儲引擎的架構上。

插件式的存儲引擎架構將查詢處理和其他的系統任務以及數據的存儲提取相分離。這種架構可以根據業務需求和實際需要選擇合適的存儲引擎。

1.1連接層

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

1.2服務層

ManagementServices & Utilities:系統管理和控制工具

SQL Interface:SQL接口,接受用戶的SQL命令,並且返回用戶需要查詢的結果。比如select from就是調用了SQL Interface

Parser:解析器,SQL命令傳遞到解析器的時候會被解析器驗證和解析。

Optimizer:查詢優化器,SQL語句在查詢之前會使用查詢優化器對查詢進行優化,用一個例子就可以理解:select uid,name from user where gender = 1;  優化器就會去決定先進行投影還是先進行過濾。

Cache和Buffer:查詢緩存,如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據,這個緩存機制是由一系列小緩存組件組成的。比如表緩存、記錄緩存、key緩存,權限緩存等。緩存負責讀,緩衝負責寫。

1.3 引擎層

存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎功能不同,可以根據自己的實際需求進行 選取,最主要並且最常用的是MyISAM和InnoDB

1.4 存儲層

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

 

1.5查詢語句執行的一個簡單流程

首先,mysql的查詢流程大致是:
1)mysql客戶端通過協議與mysql服務器建連接,發送查詢語句,先檢查查詢緩存,如果命中(一模一樣的sql才能命中),直接返回結果,否則進行語句解析,也就是說,在解析查詢之前,服務器會先訪問查詢緩存(query cache)——它存儲SELECT語句以及相應的查詢結果集。如果某個查詢結果已經位於緩存中,服務器就不會再對查詢進行解析、優化、以及執行。它僅僅將緩存中的結果返回給用戶即可,這將大大提高系統的性能。
 
2)語法解析器和預處理:首先mysql通過關鍵字將SQL語句進行解析,並生成一顆對應的“解析樹”。mysql解析器將使用mysql語法規則驗證和解析查詢;預處理器則根據一些mysql規則進一步檢查解析數是否合法。
 
3)查詢優化器當解析樹被認爲是合法的了,並且由優化器將其轉化成執行計劃。一條查詢可以有很多種執行方式,最後都返回相同的結果。優化器的作用就是找到這其中最好的執行計劃。。
 
4)然後,mysql默認使用的BTREE索引,並且一個大致方向是:無論怎麼折騰sql,至少在目前來說,mysql最多隻用到表中的一個索引。

 

2.MySQL存儲引擎

2.1查看存儲引擎

show engines;

查看默認存儲引擎

 show variables like '%storage_engine%';

2.2各個引擎簡介

InnoDB存儲引擎(默認)
InnoDB是MySQL的默認事務型引擎,它被設計用來處理大量的短期(short-lived)事務。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。行級鎖,適合高併發情況
 
MyISAM存儲引擎
MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM不支持事務和行級鎖(myisam改表時會將整個全鎖住),有一個毫無疑問的缺陷就是崩潰後無法安全恢復。
 

下面幾種引擎瞭解即可,只有上面兩種需要我們關注。
Archive引擎
Archive存儲引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
Archive表適合日誌和數據採集類應用。適合低訪問量大數據等情況。
根據英文的測試結論來看,Archive表比MyISAM表要小大約75%,比支持事務處理的InnoDB表小大約83%。
 
Blackhole引擎
Blackhole引擎沒有實現任何存儲機制,它會丟棄所有插入的數據,不做任何保存。但服務器會記錄Blackhole表的日誌,所以可以用於複製數據到備庫,或者簡單地記錄到日誌。但這種應用方式會碰到很多問題,因此並不推薦。
 
CSV引擎
CSV引擎可以將普通的CSV文件作爲MySQL的表來處理,但不支持索引。
CSV引擎可以作爲一種數據交換的機制,非常有用。
CSV存儲的數據直接可以在操作系統裏,用文本編輯器,或者excel讀取。
 
Memory引擎
如果需要快速地訪問數據,並且這些數據不會被修改,重啓以後丟失也沒有關係,那麼使用Memory表是非常有用。Memory表至少比MyISAM表要快一個數量級。(使用專業的內存數據庫更快,如redis)
 
Federated引擎
Federated引擎是訪問其他MySQL服務器的一個代理,儘管該引擎看起來提供了一種很好的跨服務器的靈活性,但也經常帶來問題,因此默認是禁用的。
 

2.3MyISAM與Innodb的區別

 innodb 索引 使用 B+TREE myisam 索引使用 b-tree
innodb 主鍵爲聚簇索引,基於聚簇索引的增刪改查效率非常高。

2.4介紹阿里巴巴的數據庫存儲引擎

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

 

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