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