1.MySQL體系架構
1.1.MySQL的分支與變種
MySQL變種有好幾個,主要有三個久經考驗的主流變種:Percona Server,MariaDB和 Drizzle。它們都有活躍的用戶社區和一些商業支持,均由獨立的服務供應商支持。同時還有幾個優秀的開源關系數據庫,值得我們了解一下。
1.1.1.Drizzle
Drizzle是真正的MySQL分支,而且是完全開源的產品,而非只是個變種或增強版本。它并不與MySQL兼容不能簡單地將MySQL后端替換為Drizzle。
Drizzle與MySQL有很大差別,進行了一些重大更改,甚至SQL語法的變化都非常大,設計目標之一是提供一種出色的解決方案來解決高可用性問題。在實現上,Drizzle清除了一些表現不佳和不必要的功能,將很多代碼重寫,對它們進行了優化,甚至將所用語言從C換成了C++。
此外,Drizzle另一個設計目標是能很好的適應具有大量內容的多核服務器、運行Linux的64位機器、云計算中使用的服務器、托管網站的服務器和每分鐘接收數以萬計點擊率的服務器并且大幅度的削減服務器成本。
1.1.2.MariaDB
在Sun收購MySQL后,Monty Widenius,這位MySQL的創建者,因不認同MySQL開發流程而離開Sun。他成立了Monty程序公司,創立了MariaDB。MariaDB的目標是社區開發,Bug修復和許多的新特性實際上,可以將MariaDB視為MySQL的擴展集,它不僅提供MySQL提供的所有功能,還提供其他功能。MariaDB是原版MySQL的超集,因此已有的系統不需要任何修改就可以運行。
諸如Google,Facebook、維基百科等公司或者網站所使用了MariaDB。不過Monty公司不是以贏利為目的,而是由產品驅動的,這可能會帶來問題,因為沒有贏利的公司不一定能長久維持下去。
1.1.3.Percona Server
由領先的MySQL咨詢公司Percona發布,Percona公司的口號就是“The Database Performance Experts”,Percona的創始人也就是《高性能MySQL》書的作者。
Percona Server是個與MySQL向后兼容的替代品,它盡可能不改變SQL語法、客戶端/服務器協議和磁盤上的文件格式。任何運行在MySQL上的都可以運行在Percona Server上而不需要修改。切換到Percona Server只需要關閉MySQL和啟動PerconaServer,不需要導出和重新導入數據。
Percona Server有三個主要的目標:透明,增加允許用戶更緊密地查看服務器內部信息和行為的方法。比如慢查詢日志中特別增加的詳細信息;性能,Percona Server包含許多性能和可擴展性方面的改進,還加強了性能的可預測性和穩定性。其中主要集中于InnoDB;操作靈活性,Percona Server使操作人員和系統管理員在讓MySQL作為架構的一部分而可靠并穩定運行時提供了很多便利。
一般來說,Percona Server中的許多特性會在后來的標準MySQL中出現。
國內公司阿里內部就運行了上千個Percona Server的實例。
1.2.MySQL的替代
1.2.1.Postgre SQL
PostgreSQL稱自己是世界上最先進的開源數據庫,同時也是個一專多長的全棧數據庫。最初是1985年在加利福尼亞大學伯克利分校開發的。
PostgreSQL 的穩定性極強,在崩潰、斷電之類的災難場景下依然可以保證數據的正確;在高并發讀寫,負載逼近極限下,PostgreSQL的性能指標仍可以維持雙曲線甚至對數曲線,到頂峰之后不再下降,表現的非常穩定,而 MySQL 明顯出現一個波峰后下滑;
PostgreSQL多年來在GIS(地理信息)領域處于優勢地位,因為它有豐富的幾何類型,實際上不止幾何類型,PostgreSQL有大量字典、數組、bitmap 等數據類型,相比之下mysql就差很多。所以總的來說,PostgreSQL更學術化一些,在絕對需要可靠性和數據完整性的時候,PostgreSQL是更好的選擇。但是從商業支持、文檔資料、易用性,第三方支持來說,MySQL無疑更好些。
1.2.2.SQLite
SQLite是世界上部署最廣泛的數據庫引擎,為物聯網(IoT)下的數據庫首選,并且是手機,PDA,甚至MP3播放器的下的首選。SQLite代碼占用空間小,并且不需要數據庫管理員的維護。SQLite沒有單獨的服務器進程,提供的事務也基本符合ACID。當然,簡單也就意味著功能和性能受限。
2.MySql基礎
2.1.MySQL體系架構
可以看出MySQL是由連接池、管理工具和服務、SQL接口、解析器、優化器、緩存、存儲引擎、文件系統組成。
連接池
由于每次建立建立需要消耗很多時間,連接池的作用就是將這些連接緩存下來,下次可以直接用已經建立好的連接,提升服務器性能。
管理工具和服務
系統管理和控制工具,例如備份恢復、Mysql復制、集群等
SQL接口
接受用戶的SQL命令,并且返回用戶需要查詢的結果。比如select ... from就是調用SQL接口
解析器
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器主要功能:1、將SQL語句分解成數據結構,后續步驟的傳遞和處理就是基于這個結構的。2、將SQL語句分解成數據結構,后續步驟的傳遞和處理就是基于這個結構的。
優化器
查詢優化器,SQL語句在查詢之前會使用查詢優化器對查詢進行優化。
緩存器
查詢緩存,如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等。
存儲引擎(后面會細講)
文件系統(后面會細講)
2.1.1.連接層
當MySQL啟動(MySQL服務器就是一個進程),等待客戶端連接,每一個客戶端連接請求,服務器進程會創建一個線程專門處理與這個客戶端的交互。當客戶端與該服務器斷開之后,不會立即撤銷線程,只會把他緩存起來等待下一個客戶端請求連接的時候,將其分配給該客戶端。每個線程獨立,擁有各自的內存處理空間。
以下命令可以查看最大的連接數:
show VARIABLES like '%max_connections%'
連接到服務器,服務器需要對其進行驗證,也就是用戶名、IP、密碼驗證,一旦連接成功,還要驗證是否具有執行某個特定查詢的權限(例如,是否允許客戶端對某個數據庫某個表的某個操作)
2.1.2.Server層(SQL處理層)
這一層主要功能有:SQL語句的解析、優化,緩存的查詢,MySQL內置函數的實現,跨存儲引擎功能(所謂跨存儲引擎就是說每個引擎都需提供的功能(引擎需對外提供接口)),例如:存儲過程、觸發器、視圖等。
當然作為一個SQL的執行流程如下:
1.如果是查詢語句(select語句),首先會查詢緩存是否已有相應結果,有則返回結果,無則進行下一步(如果不是查詢語句,同樣調到下一步)
2.解析查詢,創建一個內部數據結構(解析樹),這個解析樹主要用來SQL語句的語義與語法解析;
3.優化:優化SQL語句,例如重寫查詢,決定表的讀取順序,以及選擇需要的索引等。這一階段用戶是可以查詢的,查詢服務器優化器是如何進行優化的,便于用戶重構查詢和修改相關配置,達到最優化。這一階段還涉及到存儲引擎,優化器會詢問存儲引擎,比如某個操作的開銷信息、是否對特定索引有查詢優化等。
2.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文件中!
緩存在生產環境建議不開啟