MySQL語法執行工作原理

2021-08-19 20:27:41 字數 3520 閱讀 1437

目錄

二、從mysql語法執行原理談效能測試

三、資料庫伺服器快取配置策略

四、各資料庫集群部署方式

客戶端請求由nginx等負載均衡伺服器轉交給tomcat,tomcat從mysql中撈取資料,如果請求的資料在mysql快取中,那麼mysql會將快取中撈取到的資料返回給客戶端,如果快取中沒有請求的資料,那麼mysql會通過解析器解析sql語法是否有問題(使用者許可權問題),在sql語法沒有問題的情況下,將sql轉交給優化器,看sql是否通過索引等來進行查詢,再通過儲存引擎在磁碟中撈取資料。

詳細流程如下,對於ie–>tomcat–>mysql的流程,客戶端請求在到達tomcat後,經歷路程如下:

① 先在tomcat的jvm中撈取資料,如果撈取到對應資料,請求直接返回;

② 在mysql快取(快取資料集、sql語法、表定義、表許可權、字段)中查詢資料,若查詢到,mysql在將快取中查詢到的資料返回給應用快取時,會校驗一遍使用者許可權,此時校驗使用者許可權不會走解析器;若沒有命中快取,就會來到解析和預處理環節。

③ 將sql交給mysql的第二層對sql語句的語法進行解析,該層包括解析器以及預處理器。這裡的解析可以分為硬解析和軟解析,在sql語法沒有問題的情況下,執行下一步操作。

解析器:也叫語法解析器,sql語句經過解析器解析之後,會生成一顆對應的解析數,在解析器中,mysql會使用語法規則驗證和解析查詢,例如是否使用錯誤的關鍵字、使用關鍵字的順序是否正確、驗證引號是否能正確匹配等。

預處理器:在預處理其中,進一步解析解析數是否合法並生成一顆新的解析數。例如:檢查資料表和資料列是否存在,sql語句的名字和別名是否有歧義,之後預處理器還會校驗使用者許可權(許可權校驗一般會很快,除非伺服器上有非常多的許可權設定)。

硬解析:通過硬體監聽,例如select * from student where id=』test001』,解析sql語句以及對應操作使用者的許可權,對於乙個型別的sql,在第一次查詢的過程中,都是硬解析,查詢速度較慢。

軟解析:在查詢select * from student where id=』test002』時,當第二次使用查詢student這張表,並再次用id這個字段作為檢索欄位時,此時這條sql已經快取下來,該sql被快取成如下形式:select * from student where id=$,第二次查詢時,就不需要消耗cpu去解析這這條sql的語法,從而降低cpu的消耗。需要注意的是,mysql快取需要整個sql語句全部命中,而軟解析,當mysql只是變數變化時,就會利用已有的解析數和執行計畫。

④ 在生成了解析樹之後,便來到查詢優化器這一層,在查詢優化器中,將解析數轉化為執行計畫,一般一條查詢語句可以由多種執行計畫完成,優化器的工作是從這些執行方式中找到效能最好的執行計畫。

全表掃瞄:select * from table_name where …,將一張表無論什麼樣的資料,都全部一次性從硬碟中撈出來,這樣的方式,在表中資料量較大的情況下,磁碟io會比較大,造成cpu使用率較高(監聽io事件)。 )

⑤ 找到最優的執行計畫以後,mysql呼叫查詢執行引擎(innodb、myisam)在磁碟中撈取資料。

案例1:

存在一張表,表名為table1,欄位有id,name,age等字段,id為主鍵;同時存在第二張表,表名為table2,表字段以及資料和table1一樣,但是無主鍵,無索引,現有下列sql

select * from table1 where id = 1;

select * from table2 where id = 1;

select * from table1;

select * from table2;

上述sql語句,均會通過i/o從磁碟中撈取一張表的全部資料,無論是否使用where語句,是否使用索引,但是使用索引之後,資料庫會通過索引到快取中撈取資料,查詢效率特別高。

案例2:

場景:

存在一張表,表名為table1,欄位有id,name,age等字段,如果先到兩條sql如下:

select * from table1 where id = 1;
select * from table1 where id = 2;
第一條sql類似語法到達mysql完成解析返回結果後,第二條sql是否能夠命中快取?

分析:

對於sql語句到達mysql在快取中撈取資料時,會將這條sql進行hash操作,這條sql即使大小寫不同,語法一樣,但變數不同,都不會命中mysql的快取,此時,第二條sql會到解析器中,但是,mysql已經在解析器和預處理器中分析了第一條sql的語法,得到了對應的解析計畫,而第二條sql和第一條sql的語法相同,只是變數變化,所以在mysql快取中,仍然快取了這條sql的解析計畫,在第二條sql進入解析器時,會在mysql快取中撈取語法解析結果,如果命中,那麼就會走軟解析的路線,提高sql語句的查詢效能。

由於資料庫的快取機制和鎖機制,在混合業務線以及大併發的過程中,當增刪改查業務線並行的情況下,會出現資源爭用的現象,進行混合場景測試,可以觀察是否出現死鎖現象,而如果資料庫快取設定不合理,在混合場景以及長時間的穩定性測試的過程中,實時的大資料量查詢過程中,前面查詢得到的資料庫快取被過早的清除掉,導致資料庫頻繁的對sql語句進行解析,增大系統i/o以及資料庫查詢的時間,影響系統效能,綜上所述,對典型交易做混合場景測試以及長時間穩定性測試來驗證測試過程中對資源爭用情況的處理是否合理,快取空間配置是否充足,從而完成系統的高可靠性以及高可用性測試。所以,對於sql語句而言,統一大小寫是十分重要的

如2.1所述,資料庫快取設定太小,資料庫快取清理過快,影響系統效能,此外,對於基於mysql主從庫容災集群部署的系統如果資料庫快取配置的比較大,在一台資料庫伺服器宕機的情況下,除了在切換的瞬間查詢效率比較慢外,建立快取後,可以保證查詢的部分效能。

一般來說,資料庫快取越大,資料庫的效能越好,所以在物理記憶體足夠大的情況下,可以盡量配置多一點的記憶體給資料庫。如果物理額記憶體8g,可以配置65%給資料庫,如果物理記憶體4g,可以配置1/3給資料庫,對於2g的物理記憶體,看情況進行配置。一般而言,在將sql語法等問題都排除了,再來考慮資料庫的記憶體配置問題。

oracle

自帶集群部署方式(rac)。

mysql

mysql本身不支援集群部署,但是通過第三方工具,可以做到主從配置的方式完成集群部署。

postgresql

可使用postgresql自帶的工具(pgpool),完成集群部署。

mysql執行原理 mysql 執行原理

闡述mysql系統的各個模組是如何相親相愛的完成乙個我們認為的很簡單的查詢工作的。我們對啟動mysql,客戶端建立連線,請求query,得到返回結果,最終退出。這樣一整個過程來進行分析。第一步 當我們執行啟動mysql系統的命令之後,mysql的初始化模組就從系統配置檔案中讀取系統引數和命令列引數,...

MySQL工作原理

資料庫通常不會被直接使用,而是由其他程式語言通過sql語句呼叫mysql,由mysql處理並返回執行結果。那麼mysql接受到sql語句後,又是如何處理的呢?首先程式的請求會通過mysql的connectors與其進行互動,請求到處後,會暫時存放在連線池 connection pool 中並由處理器...

mysql 執行 MySQL工作(執行)流程

通過 mysql體系結構詳解 一節的介紹,大家對 mysql 的整體架構已經有了一定的了解,本節我們主要介紹資料庫的具體工作流程。下面是一張簡單的資料庫執行流程圖 下面從資料庫架構的角度介紹資料庫的工作流程 1.連線層 1 連線處理 客戶端同資料庫服務層通過連線管理模組建立 tcp 連線,並請求乙個...