大綱(2426字)
1.MySQL驅動的作用
2.Java系統中的資料庫連線池的作用
3.MySQL中的資料庫連線池的作用
4.網路連線必須讓執行緒來處理
5.SQL介面會負責處理接收到的SQL語句
6.查詢解析器會讓MySQL讀懂SQL語句
7.查詢最佳化器會選擇最優的查詢路徑
8.呼叫儲存引擎介面來真正執行SQL語句
9.執行器會根據執行計劃呼叫儲存引擎的介面
1.MySQL驅動的作用
如果要在Java系統中訪問MySQL,必須在系統依賴中加入MySQL驅動。有了MySQL驅動才能和MySQL建立連線,然後才能執行各種SQL語句。下面maven配置中就引入了一個MySQL驅動:
<dependency>
<groupId>MySQL</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
如果Java系統要訪問資料庫,首先得與資料庫建立一個網路連線。那麼這個連線由誰來建立呢?其實就是由MySQL驅動來建立的,它會在底層與資料庫建立網路連線。有了網路連線才能去傳送請求給資料庫伺服器,如下圖示:
當Java系統和資料庫有了網路連線後,Java程式碼才能基於這個網路連線去執行各種各樣的增刪改查SQL語句。如下圖示:
所以MySQL會提供各種語言的MySQL驅動,讓各種語言編寫的系統透過MySQL驅動去訪問資料庫。
2.Java系統中的資料庫連線池的作用
一個Java系統肯定不會只和資料庫建立一個連線。因為Java系統本身會有多個執行緒來併發地處理多個請求。如下圖示:
這時如果Java系統中的多個執行緒併發處理多個請求時,都要搶奪一個連線去訪問資料庫,那麼其效率肯定是很低的。
如果Java系統中的每個執行緒在每次訪問資料庫時,都基於MySQL驅動去建立一個自己用的資料庫連線,然後執行SQL並且在執行完SQL後再銷燬這個資料庫連線,這樣也是不可行的。
因為可能出現Java系統中上百個執行緒併發頻繁建立和銷燬資料庫連線。而每次建立一個資料庫連線都很耗時,從而導致請求處理的效率很低。
所以一般會使用一個資料庫連線池,在一個池子裡維持多個資料庫連線,讓多個執行緒使用裡面的不同的資料庫連線去執行SQL語句。執行完SQL語句後,不要銷燬這個資料庫連線,而是把連線放回池子裡,以便後續還可以繼續使用。
基於這樣的一個資料庫連線池機制,就可解決多個執行緒併發建立和銷燬多個資料庫連線去執行SQL語句的問題。
常見的資料庫連線池:DBCP、C3P0、Druid等。
3.MySQL中的資料庫連線池作用
任何一個Java系統都應該有一個資料庫連線池去訪問資料庫。也就是這個系統會有多個資料庫連線,供多執行緒併發的使用;這樣MySQL就需要維護與Java系統之間的連線,所以MySQL架構體系中的第一個環節,就是連線池。MySQL中的連線池就是維護與Java系統之間的多個資料庫連線。
除此之外,Java系統每次跟MySQL建立連線,MySQL都會根據Java系統傳遞過來的賬號密碼進行庫表許可權的驗證。
4.網路連線必須讓執行緒來處理
假設MySQL伺服器的連線池的某個連線收到了某條SQL語句的網路請求。那麼誰負責從這個連線中去監聽網路請求?誰把網路連線裡的請求資料讀取出來?
網路連線必須得分配給一個執行緒去處理,由一個執行緒來監聽請求以及讀取請求資料。比如從網路連線中讀取和解析出一條SQL語句請求。
5.SQL介面會負責處理接收到的SQL語句
當MySQL的工作執行緒從一個網路連線中讀取出一條SQL語句後,此時會如何執行這個SQL語句呢?MySQL內部會提供一個元件,就是SQL介面。
SQL介面是一套執行SQL語句的介面,它專門用於執行Java系統傳送給MySQL的增刪改查SQL語句。所以MySQL的工作執行緒讀取出SQL語句後,就會轉交給SQL介面執行。
6.查詢解析器會讓MySQL能讀懂SQL語句
假設有這麼一條SQL語句:
select id,name,age from users where id = 1;
那麼查詢解析器(Parser)會負責解析SQL語句,比如查詢解析器(Parser)會對上面這條語句進行拆解成以下幾個部分:
一.需要從"users"表裡查詢資料
二.查詢"id"欄位的值等於1的那一行資料
三.對查出來的那一行資料要提取裡面的"id,name,age"三個欄位
所謂SQL解析:就是按既定的SQL語法,對傳遞進來的SQL語句進行解析,然後理解該SQL語句的意圖。
7.查詢最佳化器會選擇最優的查詢路徑
當MySQL透過查詢解析器理解SQL語句要幹什麼後,接著就會找查詢最佳化器(Optimizer)來選擇一個最優的查詢路徑。
查詢最佳化器(Optimizer)會針對SQL語句生成查詢路徑樹,然後從裡面選擇一條最優的查詢路徑出來。
8.呼叫儲存引擎介面來真正執行SQL語句
獲取到查詢最佳化器選擇的最優查詢路徑後,即應該按照一個什麼樣的順序和步驟去執行這個SQL語句的計劃,MySQL就會把這個計劃交給底層的儲存引擎去執行。
這個儲存引擎是MySQL架構設計中很有特色的一個環節。對於資料庫而言,資料要不就是放在記憶體裡、要不就是放在磁碟檔案裡。
現在已知SQL語句會按照最優的查詢路徑進行執行,但MySQL怎麼知道哪些資料在記憶體裡、哪些資料在磁碟裡?執行時是更新記憶體的資料還是更新磁碟的資料?如果更新磁碟的資料,要先查詢哪一個磁碟檔案,再更新哪一個磁碟檔案?這些問題就需要儲存引擎來解決了。
儲存引擎在執行SQL語句時,會按一定的步驟進行一系列操作。比如查詢記憶體快取資料、查詢磁碟資料、更新磁碟資料等。
9.執行器會根據執行計劃呼叫儲存引擎的介面
儲存引擎可幫助MySQL去訪問記憶體及磁碟上的資料,那麼誰來呼叫儲存引擎的介面呢?那就是執行器。
執行器會根據查詢最佳化器選擇的執行方案,去呼叫儲存引擎的介面。執行器會按照一定的順序和步驟,去執行SQL語句的邏輯。
比如執行器首先會呼叫儲存引擎的介面去獲取"users"表中的第一行資料。然後判斷一下這個資料的"id'欄位的值是否等於SQL語句期望的一個值。如果不等那就繼續呼叫儲存引擎的介面去獲取"users"表的下一行資料。
基於類似思路,執行器會根據查詢最佳化器生成的一套執行計劃,不停地呼叫儲存引擎的各種介面去完成SQL語句的執行計劃,從而不停地更新或者查詢獲取資料。
總結:MySQL驅動 -> 資料庫連線池 -> 網路IO執行緒 -> SQL介面 -> 查詢解析器 -> 查詢最佳化器 -> 執行器 -> 呼叫儲存引擎介面
SQL的執行流程:
一.由MySQL工作執行緒去監聽網路請求和讀取網路連線的SQL資料;
二.MySQL工作執行緒讀取出SQL語句後會轉交給SQL介面去執行;
三.透過查詢解析器Parser解析SQL語句讓MySQL能看得懂SQL邏輯;
四.透過查詢最佳化器Optimizer選擇最優的查詢路徑;
五.由執行器按照查詢最佳化器選擇的執行計劃不停呼叫儲存引擎介面;
六.儲存引擎介面會查詢記憶體快取資料、查詢磁碟資料、更新磁碟資料等;