周鵬
摘要
大數(shù)據(jù)時代之下,MySQL數(shù)據(jù)庫的運行效率作為關(guān)鍵問題得到了廣泛關(guān)注。文章首先對于MySQL數(shù)據(jù)庫多線程引擎構(gòu)架思路進行必要說明,而后進一步結(jié)合其多線程引擎框架展開說明,對于加強該領(lǐng)域的認識有著一定的積極意義。
【關(guān)鍵詞】MySQL 數(shù)據(jù)庫 多線程 連接池
當前網(wǎng)絡(luò)時代中,人們對于數(shù)據(jù)的依賴與日俱增,為數(shù)眾多的應(yīng)用極大地方便了整個社會方方面面的生活與工作,但是也帶來了海量數(shù)據(jù)。隨著數(shù)據(jù)總量的不斷攀升,對網(wǎng)絡(luò)環(huán)境中個個方面的能力也都提出了新的要求,除了傳輸速度以外,比較核心的瓶頸問題則出現(xiàn)在程序優(yōu)化方面,而在程序領(lǐng)域,數(shù)據(jù)庫作為程序運行的根基,其價值不容忽視。MySQL本身的開源特征,加之其易用以及可靠性等方面的諸多優(yōu)勢,目前已經(jīng)成為網(wǎng)絡(luò)環(huán)境中數(shù)據(jù)庫程序的首選,也正因為如此MySQL數(shù)據(jù)庫的優(yōu)化就成為重點,其多線程引擎的實現(xiàn),作為提升用戶體驗的重要環(huán)節(jié),其意義不言而喻。
1 MySQL數(shù)據(jù)庫多線程引擎構(gòu)架思路
MySQL數(shù)據(jù)庫領(lǐng)域中,比較傳統(tǒng)的設(shè)立方案主要有兩種。其一為單線程MySQL連接,其二則為多線程操作連接。對于前者而言,由于只允許一個線程面向MySQL進行操作,因此整體執(zhí)行效率低下成為此種模式的主要特征;而對于后者而言,雖然在線程數(shù)量方面有所提升,實現(xiàn)了多線程,但是從根本上看,是多個線程對同一個MySQL連接進行操作,串行數(shù)據(jù)龐大,對MySQL連接實現(xiàn)爭搶,同樣無法提升執(zhí)行效率。在這樣的背景之下,為了能夠更好地滿足大數(shù)據(jù)環(huán)境中的并行操作需求,可以引入“池”的概念對MySQL體系進行優(yōu)化,建立起連接池,并且利用多線程技術(shù)切實提升業(yè)務(wù)查詢整體效率。
目前 MySQL的體系,比較常見的形態(tài),是將業(yè)務(wù)應(yīng)用層與數(shù)據(jù)庫底層直接實現(xiàn)耦合,應(yīng)用層可以對數(shù)據(jù)庫連接進行直接調(diào)用,API函數(shù)的更新也有賴于此。此種方式要求數(shù)據(jù)庫用戶必須對函數(shù)系統(tǒng)比較熟悉,等于降低了數(shù)據(jù)庫系統(tǒng)本身的易用特征。針對目前MySQL的這種情況,可以重點從推進其底層透明化,實現(xiàn)代碼等資源共享,并且降低系統(tǒng)模塊之間的耦合程度的角度出發(fā)展開優(yōu)化。當前動態(tài)鏈接庫已經(jīng)能夠在模塊封裝降低耦合的方面實現(xiàn)一定程度的優(yōu)化,但是除此以外,還可以建立起數(shù)據(jù)庫連接池的方式,來提升系統(tǒng)的響應(yīng)速度。一個比較典型的引入數(shù)據(jù)庫連接池的MySQL架構(gòu),應(yīng)當保持一種層次化的結(jié)構(gòu)特征,業(yè)務(wù)應(yīng)用層與數(shù)據(jù)庫連接池保持直接溝通,而數(shù)據(jù)庫緩存層則接受數(shù)據(jù)庫連接池的統(tǒng)一管理,同時與數(shù)據(jù)庫驅(qū)動層保持聯(lián)系。
2 MySQL數(shù)據(jù)庫多線程引擎框架具體功能分析
為了能夠進一步加深對于此種框架的認識,在此深入到具體的框架層面中,對各個層級展開分析。
(1)業(yè)務(wù)應(yīng)用層,這一層承擔具體的應(yīng)用,面向用戶直接展開溝通與工作。業(yè)務(wù)層的價值,在于面向用戶而實現(xiàn)其他各個功能層的屏蔽和透明,并且以應(yīng)用需求作為核心,以模塊的形態(tài)實現(xiàn)對于功能的滿足。從用戶的角度看,只需要調(diào)用PostTask函數(shù)就可以實現(xiàn)對于SQL語句的執(zhí)行,這種操作方式大大簡化了傳統(tǒng)對于MySQL數(shù)據(jù)庫的控制,用戶不需要掌握API函數(shù)就可以展開工作。
(2)位于業(yè)務(wù)應(yīng)用層之下的數(shù)據(jù)庫連接池,是構(gòu)造MySQL數(shù)據(jù)庫系統(tǒng)并行處理方式的核心所在。多線程技術(shù)與數(shù)據(jù)庫連接池相結(jié)合,能夠有效改善在多任務(wù)大數(shù)據(jù)量環(huán)境中,數(shù)據(jù)庫執(zhí)行能效偏低、響應(yīng)速度慢等方面問題。通常情況下,MySQL框架中的多線程會共享多個數(shù)據(jù)庫連接,當存在線程發(fā)出數(shù)據(jù)庫連接請求的時候,會從空閑隊列中分配對應(yīng)的空閑連接,將其分配給該線程。此種工作模式之下,多個線程之間必然會形成競爭,當它們同時發(fā)起對一個連接資源的請求的時候,這種競爭會格外突出。與此同時,另一個不容忽視的問題在于,在這種競爭的過程中,連接資源數(shù)據(jù)的一致性很難得到保證,線程被賦予操作權(quán)限,但是線程本身對資源的爭奪導(dǎo)致其操作順序無法保證,因此很容易造成對同一條數(shù)據(jù)的更新操作混亂的問題發(fā)生。為了能夠?qū)Υ朔N狀況實現(xiàn)改善,可以考慮將一個線程與一個MySQL連接進行組合,形成一個固定的連接單元,多個連接單元共同構(gòu)成連接池。如果在并行操作中出現(xiàn)對同一條數(shù)據(jù)記錄的操作指令,則都會通過此記錄主鍵值哈希映射分配給同一個連接單元的線程執(zhí)行,保證數(shù)據(jù)庫更新操作的有序性。在這種模式之下,主線程不參與操作結(jié)果解析,僅僅將操作保存在任務(wù)隊列中即返回,對于操作結(jié)果的解析工作,則交由后臺線程予以完成,并且將操作結(jié)果異步返回給主線程。在程序結(jié)束的時候,通過調(diào)用join()來保證子線程執(zhí)行完畢,避免因為丟失操作而造成的數(shù)據(jù)存儲故障。
(2)位于數(shù)據(jù)庫連接池之下的數(shù)據(jù)庫緩存層,以及與其相聯(lián)系的數(shù)據(jù)庫驅(qū)動層,則分別負責保存數(shù)據(jù)庫操作反饋結(jié)果,以及負責實現(xiàn)MySQL連接兩項職能。具體而言,數(shù)據(jù)庫緩存層主要實現(xiàn)對數(shù)據(jù)庫查詢結(jié)果進行解析與緩存處理,具體包括數(shù)據(jù)集IRecordset、數(shù)據(jù)記錄 IRecord和數(shù)據(jù)字段IField三個主要方面。數(shù)據(jù)集IRecordset類中包括多個IRecord對象,負責保存數(shù)據(jù)記錄的對應(yīng)信息,并且依據(jù)索引實現(xiàn)對于對象的獲取,同時提供查詢反饋結(jié)果具體內(nèi)容;數(shù)據(jù)記錄IRecord類負責聚合多個IField對象,保存數(shù)據(jù)字段信息并且依據(jù)索引獲取對象,包括主鍵字段的獲取職能;而IField類則用于實現(xiàn)常用類型轉(zhuǎn)換函數(shù)的提供,并且保存字段信息,對于不支持MySQL數(shù)據(jù)類型的語言環(huán)境,可以依據(jù)此來實現(xiàn)對應(yīng)的轉(zhuǎn)換。而位于最底層的數(shù)據(jù)庫驅(qū)動層,則主要負責為數(shù)據(jù)庫操作提供對應(yīng)的MySQL連接句柄,確保其能夠得以執(zhí)行,其中包括對于數(shù)據(jù)庫的連接、查詢、結(jié)果返回以及MySQL服務(wù)器信息的獲取等等。
3 結(jié)論
在MySQL數(shù)據(jù)庫體系中,其對于線程的并行處理支持程度成為優(yōu)化的核心問題,通過構(gòu)建起數(shù)據(jù)庫連接池的方式,能夠有效推動數(shù)據(jù)庫工作效能的提升,應(yīng)用效果良好,反應(yīng)時間雖然需要進一步的測試進行確定,但是從實驗角度看,對于當前網(wǎng)絡(luò)環(huán)境的更好支持有著一定的積極意義。
參考文獻
[1]谷偉,陳蓮君.基于MySq1的查詢優(yōu)化技術(shù)研究[J].微型電腦應(yīng)用,2013,30(07).
[2]吳淪舟,蘭逸正,張輝.基于MySQL數(shù)據(jù)庫的優(yōu)化[J].電子科技,2013,26(09).
[3]姚冬,分布式操作系統(tǒng)中多任務(wù)分配與進程線程調(diào)度[J].計算機光盤軟件與應(yīng)用,2011(06).