高性能MySQL學習筆記(1) —— MySQL架構
MySQL架構
1.MySQL邏輯架構:
這里分為三層:
1.連接層:連接與線程處理,這一層並不是MySQL獨有,一般的基於C/S架構的都有類似組件,比如連接處理、授權認證、安全等。
2.SQL處理層:也叫MySQL服務器層,包括緩存查詢、解析器、優化器,這一部分是MySQL核心功能,包括解析、優化SQL語句,查詢緩存目錄,內置函數(日期、時間、加密等函數)的實現
3.數據存儲層:也叫存儲引擎層,負責數據存儲,存儲引擎的不同,存儲方式、數據格式、提取方式等都不相同,這一部分也是很大影響數據存儲與提取的性能的。但是,與分層的思想一致,SQL處理層是通過API與存儲引擎通信的,API屏蔽了下層的差異,下層提供對外接口,上層負責調用即可,不必清楚下層是怎么實現的。
客戶端說明:MySQL是基於C/S架構的,這里的客戶端自然是專門的,能訪問到MySQL服務器的,主要有這么幾類,操作客戶端:單純的操作MySQL服務器中的數據(這里數據包括庫、表、索引、表中數據等),比如常用的native、phpMyAdmin、Sequal Pro等;應用客戶端:應用程序通過程序訪問數據庫,比如JDBC、ODBC、PHP程序、python程序等。不管是哪種,其實最后都轉換為SQL語句訪問MySQL。
1.連接層
當MySQL啟動(MySQL服務器就是一個進程),等待客戶端連接,每一個客戶端連接請求,服務器都會新建一個線程處理(如果是線程池的話,則是分配一個空的線程),每個線程獨立,擁有各自的內存處理空間,但是,如果這個請求只是查詢,沒關系,但是若是修改數據,很顯然,當兩個線程修改同一塊內存是會引發數據同步問題的。
>連接處理流程
連接到服務器,服務器需要對其進行驗證,也就是用戶名、IP、密碼驗證,一旦連接成功,還要驗證是否具有執行某個特定查詢的權限(例如,是否允許客戶端對某個數據庫某個表的某個操作)。
>認證流程
2.SQL處理層
這一層主要功能有:SQL語句的解析、優化,緩存的查詢,MySQL內置函數的實現,跨存儲引擎功能(所謂跨存儲引擎就是說每個引擎都需提供的功能(引擎需對外提供接口)),例如:存儲過程、觸發器、視圖等。
>執行過程:
(圖中的查詢並不是一定是select語句,在MySQL中,一般習慣把每一條SQL命令稱為query(查詢))
1.如果是查詢語句(select語句),首先會查詢緩存是否已有相應結果,有則返回結果,無則進行下一步(如果不是查詢語句,同樣調到下一步);
2.解析查詢,創建一個內部數據結構(解析樹),這個解析樹主要用來SQL語句的語義與語法解析;詳情可查看:MySQL解析器。
3.優化:優化SQL語句,例如重寫查詢,決定表的讀取順序,以及選擇需要的索引等。這一階段用戶是可以查詢的,查詢服務器優化器是如何進行優化的,便於用戶重構查詢和修改相關配置,達到最優化。這一階段還涉及到存儲引擎,優化器會詢問存儲引擎,比如某個操作的開銷信息、是否對特定索引有查詢優化等。詳情可查看:MySQL優化器。
3.存儲引擎
存儲引擎,也稱為表類型,主要用來存儲數據的,不同的存儲引擎采用不同的技術(存儲機制、索引機制、鎖定機制)存儲數據,這主要是為了滿足數據存儲要求,比如有的數據不需要大量的改動,只用來查詢,而有的數據則需要常常修改(數據插入、刪除、更新),針對各種業務情況,為了更好的數據處理效率采用不同的數據存儲技術(即不同存儲引擎)。
MySQL的存儲引擎是插件式的,也就是說,用戶可以隨時切換MySQL的存儲引擎:針對表或針對庫都可(通過SQL語句命令)。這種靈活性也是為什么MySQL受到歡迎的一個重要原因。MySQL集合了多種引擎:MyISAM、InnoDB、BDB、Merge、Memory等,默認的是InnoDB(MySQL5.5開始,以前是MyISAM)。
2.MySQL物理組件
以下主要參考文章:MySQL架構(guisu)。
以上組件是對邏輯架構的實現:
1.Management Services & Utilities
服務管理和控制組件,主要用來回滾操作、恢復數據、數據的復制、遷移、元數據的管理等。
2.Connection Pool:連接池
連接池,對應邏輯架構的連接層,主要用來管理用戶連接,包括監聽、接收客戶端請求,轉發請求到相應的線程管理模塊(該模塊負責維護這些線程,包括創建、線程cache,可有線程池實現),還有連接的權限認證工作。
3.SQL Interface:SQL接口
各種SQL接口,用來接收管理SQL命令,比如DML、DDL操作,存儲過程,視圖,觸發器等。
4.Parser:解析器
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本。
主要功能:
a . 將SQL語句進行語義和語法的分析,分解成數據結構,然后按照不同的操作類型進行分類,然后做出針對性的轉發到后續步驟,以后SQL語句的傳遞和處理就是基於這個結構的。
b. 如果在分解構成中遇到錯誤,那么就說明這個sql語句是不合理的。
5.Optimizer: 查詢優化器
優化SQL語句,比如常量轉換與計算、無效代碼排除、AND/OR等等優化。查詢優化器必要的時候還會詢問存儲引擎,計算語句執行消耗,從而得出最優策略去執行該SQL命令。
6.Cache & Buffer: 查詢緩存
他的主要功能是將客戶端提交 給MySQL 的 Select 類 query 請求的返回結果集 cache 到內存中,與該 query 的一個 hash 值 做一個對應。該 Query 所取數據的基表發生任何數據的變化之后, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應用系統中, Query Cache 對性能的提高是非常顯著的。當然它對內存的消耗也是非常大的。
如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等
7.存儲引擎
目前只有MySQL實現了插件式多存儲引擎(加了一層抽象層對接下面的存儲數據層),其他數據庫基本上使用單一的存儲引擎。MySQL的存儲引擎是基於表的,每個表可選擇自己需要的存儲引擎。
-
《高性能MySQL》學習筆記二
今天打算繼續學習《高性能MySQL》的第四章,有關數據庫的優化。Schema與數據類型優化前置知識:如何設計數據庫? 關於這方面我是在CSDN博客上找文章看的。選擇優化的數據類型三大原則:(簡單、小...- u012723607
- 2017年08月09日 15:35
- 88
-
《高性能MySQL》讀書筆記(上)
《High Performance MySQL》真是本經典好書,從應用層到數據庫到硬件平台,各種調優技巧、常見問題全都有所提及。數據庫的各種概念技巧平時都有接觸,像索引、分區、Sharding等等,但...- dc_726
- 2014年12月06日 19:31
- 6233
-
-
2017年!全球AI人才薪酬報告出爐了!中國區AI人才最貴?
給大家分享下2017年AI程序員的人才報告,服了!薪酬最高的竟然不是谷歌!~
-
-
票選結果:Python再上天,微軟要求全員學Python?
宇宙語言Python榮登年度排行榜,吳恩達,微軟紛紛為它站台,Python這么牛逼的原因是....
-
-
票選結果:Python再上天,微軟要求全員學Python?
宇宙語言Python榮登年度排行榜,吳恩達,微軟紛紛為它站台,Python這么牛逼的原因是....
-
《高性能MySQL》讀書筆記--多版本並發控制算法
InnoDB存儲引擎MVCC的實現策略: 在每一行數據中額外保存兩個隱藏的列:當前行創建時的版本號和刪除時的版本號(可能為空)。這里的版本號並不是實際的時間值,而是系統版本號。每開始 個新的事務,系...- xifeijian
- 2015年04月25日 22:45
- 6740
-
-
Delphi7高級應用開發隨書源碼
- 2003年04月30日 00:00
- 676KB
- 下載
-
《高性能MySQL》讀書筆記
《High Performance MySQL》真是本經典好書,從應用層到數據庫到硬件平台,各種調優技巧、常見問題全都有所提及。數據庫的各種概念技巧平時都有接觸,像索引、分區、Sharding等等,但...- stark_summer
- 2015年09月28日 07:38
- 26401
-
socket阻塞與非阻塞,同步與異步
1. 概念理解 在進行網絡編程時,我們常常見到同步(Sync)/異步(Async),阻塞(Block)/非阻塞(Unblock)四種調用方式: 同步: 所謂...- xhjcehust
- 2015年01月16日 21:26
- 566
-
【學習筆記】高性能MySQL(第三版)——第1章:MySQL架構與歷史
MySQL並不完美,卻足夠靈活,能夠適應高要求的環境,例如Web類應用。同時,MySQL既可以嵌入到應用程序中,也可以支持數據倉庫、內容索引和部署軟件、高可用的冗余系統、在線事務處理系統(OLTP)等...- qq157962718
- 2016年03月28日 01:08
- 660
-
高性能MySQL學習筆記(2) —— 並發控制
MySQL 並發控制前一節已經說過了,MySQL是多線程應用,並且共享存儲數據,很顯然,當兩個及以上線程對同一塊數據進行寫將會發生數據不一致等各種問題,比如,同時對一個表增加一條記錄,后一個增加的記錄...- a327369238
- 2016年09月29日 11:44
- 379
-
高性能MySQL學習筆記(4) —— 事務隔離級別
事務隔離級別事務的ACID屬性中的隔離性,如何實現呢?在SQL標准中定義了四種隔離級別。 但要注意,標准中定義的這四個級別,在實際上各個存儲引擎的實現是不盡相同的,有些細節地方還是不一樣的,學習的時...- a327369238
- 2016年10月13日 16:40
- 373
-
高性能MySql學習筆記——鎖、事務、隔離級別
為什么需要鎖? 因為數據庫要解決並發控制問題。在同一時刻,可能會有多個客戶端對Table1.rown進行操作,比如有的在讀取該行數據,其他的嘗試去刪除它。為了保證數據的一致性,數據庫就要對這種並發操...- Sandeldeng
- 2016年10月17日 09:30
- 244
-
高性能MySql學習筆記——鎖、事務、隔離級別
為什么需要鎖? 因為數據庫要解決並發控制問題。在同一時刻,可能會有多個客戶端對Table1.rown進行操作,比如有的在讀取該行數據,其他的嘗試去刪除它。為了保證數據的一致性,數據庫就要對這種並...- zhaoliang831214
- 2016年05月17日 09:56
- 228
-
-
高性能mysql學習筆記
- 2016年06月22日 13:54
- 518KB
- 下載
-
-
Mysql高性能學習筆記02
- 2014年05月23日 22:12
- 247KB
- 下載
-
高性能MySQL(第二版)第三章 架構優化和索引(上)——讀書筆記
一,選擇優化的數據類型 更小通常更好 更小的數據類型使用了更少的磁盤,內存和CPU緩存 但是要確保不要低估需要保存的值,在架構中的多個地方增加數據類型的范圍是一件極其費時...- very9527
- 2013年03月15日 09:22
- 746
-
【學習筆記】高性能MySQL(第三版)——第2章:MySQL基准測試
基准測試(benchmark)是MySQL新手和專家都需要掌握的一項基本技能。簡單地說,基准測試是針對系統設計的一種壓力測試。通常的目標是為了掌握系統的行為。但也有其他原因,如重現某個系統狀態,或者做...- qq157962718
- 2016年03月28日 23:01
- 604
-
高性能MySQL讀書筆記:1、MySQL架構與歷史
MySQL邏輯架構 MySQL具有分層架構,上層是服務器層的查詢和執行引擎下層是存儲引擎。其中,服務器層又包含兩層,第一層負責連接/線程處理、授權認證、安全,第二層負責查詢解析、分析、優化、緩存以及...- zcy19941015
- 2016年12月20日 23:50
- 288
-
《高性能MySql》學習筆記 持續更新
1.盡量避免NULL 如果查詢中包含可為NULL的列,對MySql來書更難優化。2.浮點類型 無論使用float還是double,MySql使用double作為內部浮點計算3.Decimal...- renpengddxx
- 2017年06月18日 17:07
- 122
-
【學習筆記】《高性能MYSQL》對性能優化定義
本文屬於讀書筆記,大部分內容摘抄於《高性能MYSQL》,摘抄內容版權屬於原作者。 在《高性能mysql》中將西能定義為完成某件任務所需要的時間度量,換句話說,性能即響應時間。按照這個定義,我...- sinat_38232376
- 2017年04月08日 16:59
- 252
-
《高性能MySQL》學習筆記三
創建高性能的索引索引對於良好的性能非常關鍵,尤其是當表中的數據量越來越大時,索引對性能的影響愈發重要,但不恰當的索引對性能的影響也會很大,所以創建高性能的索引很重要。索引基礎什么是索引? 在...- u012723607
- 2017年08月09日 17:33
- 124
-
mysql高性能學習筆記整理
1.ACID 表示原子性,一致性,隔離性,持久性,一個運行良好的事物處理系統,必須具備這些特征。 原子性:一個事務必須被視為一個不可分割的最小工作單元,整個事務中 所有的操作要么提交成功,要么全部提交...- u011156212
- 2014年02月28日 16:29
- 692



博主專欄
-
Java源碼解析
11601


他的熱門文章
- Java中float/double取值范圍與精度
22452
- Spring Bean生命周期詳解
6781
- Mac Charles亂碼解決辦法
6750
- Type Java類型
6432
- 4211