邵泳兵
(汕頭職業(yè)技術(shù)學(xué)院,廣東 汕頭 515078)
隨著計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,互聯(lián)網(wǎng)上的所有信息都呈指數(shù)級(jí)增長(zhǎng),成為一個(gè)巨大的信息數(shù)據(jù)庫(kù),與此同時(shí),各種企業(yè)已經(jīng)開(kāi)發(fā)了許多具有不同軟件和硬件平臺(tái)的應(yīng)用系統(tǒng)。數(shù)據(jù)資源在應(yīng)用系統(tǒng)中不斷積累,已經(jīng)形成了成千上萬(wàn)種異構(gòu)數(shù)據(jù)源,其中大多數(shù)是傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)。由于不同的軟件和硬件平臺(tái)以及不同的數(shù)據(jù)模型,這些數(shù)據(jù)資源形成異構(gòu)數(shù)據(jù),這使各種數(shù)據(jù)源的互操作性變得復(fù)雜[1]。
關(guān)系數(shù)據(jù)庫(kù)是使用關(guān)系模型組織數(shù)據(jù)的數(shù)據(jù)庫(kù)。簡(jiǎn)而言之,關(guān)系模型是類(lèi)似于二維表的模型,關(guān)系數(shù)據(jù)庫(kù)是由二維表和其中包含的數(shù)據(jù)組成的數(shù)據(jù)組織。關(guān)系數(shù)據(jù)庫(kù)中有幾個(gè)術(shù)語(yǔ)需要理解。(1)關(guān)系:在二維表中,每個(gè)關(guān)系都有一個(gè)關(guān)系名稱(chēng),常用的表名是table。(2)屬性:在二維表中,它類(lèi)似于Excel表中稱(chēng)為數(shù)據(jù)庫(kù)字段的列。(3)域:屬性值的范圍,即數(shù)據(jù)庫(kù)中字段的屬性約束。(4)關(guān)系模式:表示關(guān)系的描述,格式為關(guān)系名稱(chēng),換句話說(shuō),它是數(shù)據(jù)庫(kù)的表結(jié)構(gòu)。
由于數(shù)據(jù)庫(kù)應(yīng)用程序的擴(kuò)展和數(shù)據(jù)對(duì)象的多樣化,現(xiàn)有的關(guān)系數(shù)據(jù)模型暴露出許多問(wèn)題,在傳統(tǒng)的數(shù)據(jù)庫(kù)中,沒(méi)有數(shù)據(jù)存儲(chǔ),沒(méi)有專(zhuān)用軟件來(lái)管理系統(tǒng)中的數(shù)據(jù),沒(méi)有數(shù)據(jù)共享,數(shù)據(jù)不具備獨(dú)立性這些都是傳統(tǒng)數(shù)據(jù)庫(kù)的特點(diǎn)。在文件系統(tǒng)級(jí)別上,數(shù)據(jù)可以以文件形式長(zhǎng)時(shí)間存儲(chǔ)。但是,在這種結(jié)構(gòu)中,易于出現(xiàn)數(shù)據(jù)的獨(dú)立性和共享性差,高冗余性以及數(shù)據(jù)傳輸之間的不一致。在數(shù)據(jù)庫(kù)的系統(tǒng)級(jí)別上,數(shù)據(jù)被結(jié)構(gòu)化,數(shù)據(jù)共享得到改善,冗余性降低,數(shù)據(jù)獨(dú)立性很高,并且集成了數(shù)據(jù)控制功能。根據(jù)數(shù)據(jù)庫(kù)系統(tǒng)中特定數(shù)據(jù)模型結(jié)構(gòu)化,考慮該數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu),同時(shí)考慮連接數(shù)據(jù)后的數(shù)據(jù)結(jié)構(gòu),而這些在傳統(tǒng)的數(shù)據(jù)庫(kù)中都是看不到的[2]。
非關(guān)系數(shù)據(jù)庫(kù)的本質(zhì)是傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的簡(jiǎn)化版本。通過(guò)減少功能,可以大大提高產(chǎn)品性能,類(lèi)似于典型游戲的數(shù)據(jù)字段。
當(dāng)前市場(chǎng)上流通的大多數(shù)主流非關(guān)系數(shù)據(jù)庫(kù)基本上都是免費(fèi)的。大型企業(yè)中著名的關(guān)系數(shù)據(jù)庫(kù)開(kāi)發(fā)軟件(例如Oracle和DB2)是要收費(fèi)的。這極大地限制了某些私人用戶的使用。但是,在許多小型企業(yè)實(shí)際開(kāi)發(fā)中,不需要形成完整的關(guān)系數(shù)據(jù)庫(kù),非關(guān)系數(shù)據(jù)庫(kù)的功能就足夠了。在這種情況下,使用具有高性能和低成本的非關(guān)系數(shù)據(jù)庫(kù)顯然是首選。在性能方面,NOSQL基于可理解的鍵值對(duì),類(lèi)似于Java和HashMap中的鍵值對(duì)。同樣,基于鍵值對(duì)的可伸縮性也很好,并且數(shù)據(jù)之間的耦合程度相對(duì)較低,因此使用時(shí)非常容易擴(kuò)展。
數(shù)據(jù)庫(kù)實(shí)現(xiàn)了整個(gè)數(shù)據(jù)結(jié)構(gòu),這是數(shù)據(jù)庫(kù)的主要特征之一。這也是數(shù)據(jù)庫(kù)和文件系統(tǒng)之間的根本區(qū)別。意味著在考慮應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)時(shí),還應(yīng)該考慮整個(gè)組織的數(shù)據(jù)結(jié)構(gòu)。在數(shù)據(jù)庫(kù)中,數(shù)據(jù)不僅是整體結(jié)構(gòu),而且在訪問(wèn)數(shù)據(jù)方面也非常靈活,從而可以訪問(wèn)特定的數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng)組,一個(gè)記錄或一組記錄。在文件系統(tǒng)中,數(shù)據(jù)訪問(wèn)單元是記錄,并且粒度不能細(xì)分到數(shù)據(jù)項(xiàng)。
數(shù)據(jù)庫(kù)的復(fù)雜性主要在于數(shù)據(jù)本身以及數(shù)據(jù)處理過(guò)程中。首先,對(duì)于現(xiàn)代應(yīng)用程序而言,數(shù)據(jù)量巨大,并且對(duì)大量數(shù)據(jù)的管理相對(duì)復(fù)雜。其次,數(shù)據(jù)之間的關(guān)系是由于數(shù)據(jù)與數(shù)據(jù)之間的動(dòng)態(tài)關(guān)系而產(chǎn)生的(例如,多種語(yǔ)義,多種類(lèi)型等)。所有都是動(dòng)態(tài)關(guān)聯(lián),并且沒(méi)有明確定義時(shí)間和空間之間的關(guān)系。
數(shù)據(jù)和程序獨(dú)立地將數(shù)據(jù)的定義與程序分開(kāi),并且DBMS提供了訪問(wèn)數(shù)據(jù)的方式,從而簡(jiǎn)化了應(yīng)用程序的準(zhǔn)備,并大大減少了應(yīng)用程序的維護(hù)和修改。
數(shù)據(jù)模型是數(shù)據(jù)存儲(chǔ)計(jì)劃設(shè)計(jì)中的主要考慮因素。模型是對(duì)目標(biāo)對(duì)象的模擬描述。模型不僅需要了解事物的本質(zhì),而且還是溝通和討論解決方案的重要工具。數(shù)據(jù)建模是設(shè)計(jì)數(shù)據(jù)存儲(chǔ)的第一步,其輸出是獲得滿足實(shí)際需求的數(shù)據(jù)模型,然后獲得可以實(shí)施的行動(dòng)計(jì)劃。從理論上講,一個(gè)完整的數(shù)據(jù)模型包括三個(gè)方面:結(jié)構(gòu),行為和約束。
在數(shù)據(jù)庫(kù)領(lǐng)域,包括數(shù)據(jù)庫(kù)管理員和數(shù)據(jù)庫(kù)編程開(kāi)發(fā)人員的職位。對(duì)數(shù)據(jù)庫(kù)管理員來(lái)說(shuō),解決方案應(yīng)盡可能有效,范式原理最好在理想狀態(tài)下實(shí)現(xiàn),以便將來(lái)的數(shù)據(jù)維護(hù)方便且清晰。而對(duì)于數(shù)據(jù)庫(kù)開(kāi)發(fā)人員來(lái)說(shuō),在為應(yīng)用程序系統(tǒng)設(shè)計(jì)存儲(chǔ)解決方案時(shí),希望盡可能地提高存儲(chǔ)解決方案的性能和效率,但是在提高性能和效率時(shí),不可避免地要違反價(jià)格的理論范式,就像編程增加了應(yīng)用程序的實(shí)時(shí)并發(fā)數(shù)量并保持?jǐn)?shù)據(jù)準(zhǔn)確性一樣,程序的實(shí)時(shí)并發(fā)數(shù)量增加,就不能保證數(shù)據(jù)的準(zhǔn)確性。為了改善數(shù)據(jù),必須減少應(yīng)用程序系統(tǒng)。無(wú)論應(yīng)用程序?qū)崟r(shí)并發(fā)的規(guī)模如何,以及數(shù)據(jù)準(zhǔn)確性是否更為重要,實(shí)時(shí)并發(fā)的數(shù)量都是一個(gè)重要因素,而不是行業(yè)中的統(tǒng)一標(biāo)準(zhǔn)。原理是根據(jù)實(shí)際需求選擇兩者的權(quán)重[3]。
設(shè)計(jì)數(shù)據(jù)數(shù)據(jù)庫(kù)存儲(chǔ)方案時(shí),不能概括相同的原理。重要的是提高存儲(chǔ)系統(tǒng)的性能和效率,或者確保理論范式的原理是完整的。通常,為了提高性能,要設(shè)計(jì)表實(shí)體,避免頻繁的表聯(lián)接操作。一般來(lái)說(shuō),為了減少由表聯(lián)接操作對(duì)系統(tǒng)性能造成的額外開(kāi)銷(xiāo),一般會(huì)考慮在主要業(yè)務(wù)實(shí)體中增加其他輔助業(yè)務(wù)的信息。盡管這在某種程度上破壞了企業(yè)范式的原理,但也是可以接受的,尤其是在響應(yīng)性優(yōu)化對(duì)大數(shù)據(jù)業(yè)務(wù)特別重要的情況下。當(dāng)然,為了確保業(yè)務(wù)在的科學(xué)合理,不能完全忽略范式原則并盲目追求性能,從而導(dǎo)致實(shí)體的過(guò)多冗余,并使存儲(chǔ)解決方案產(chǎn)生混亂且難以維護(hù)。
互聯(lián)網(wǎng)時(shí)代實(shí)際上是數(shù)據(jù)時(shí)代。數(shù)據(jù)分頁(yè)的效率很重要,是系統(tǒng)性能的重要評(píng)估指標(biāo)。使用這種方法,當(dāng)數(shù)據(jù)量和并發(fā)訪問(wèn)量較小時(shí),分頁(yè)就不會(huì)出現(xiàn)問(wèn)題。但是,在有大量數(shù)據(jù)的情況下,跳過(guò)行為非常慢,因此需要改進(jìn)和優(yōu)化分頁(yè)技術(shù),以提高大數(shù)據(jù)查詢和顯示性能。目前,國(guó)內(nèi)外改進(jìn)分頁(yè)技術(shù)的主要方法有兩種。一種是限制結(jié)果集中的頁(yè)面數(shù),類(lèi)似于搜索引擎結(jié)果分頁(yè)策略。當(dāng)顯示的結(jié)果非常龐大時(shí),用戶只能看到前60到70頁(yè)的數(shù)據(jù),此方法將結(jié)果限制為少于10,000條記錄,因此可以快速獲取頁(yè)面數(shù)據(jù),但是顯示的數(shù)據(jù)不完整。第二種方法是針對(duì)數(shù)據(jù)庫(kù)和內(nèi)存的查詢,將通過(guò)將所有合適的數(shù)據(jù)放入數(shù)組來(lái)加快數(shù)據(jù)分頁(yè)。但是,隨著結(jié)果集數(shù)據(jù)的增長(zhǎng),主機(jī)的內(nèi)存需求太大,這可能導(dǎo)致內(nèi)存溢出并影響Web應(yīng)用程序的穩(wěn)定性。同時(shí),所有記錄一次返回,網(wǎng)絡(luò)數(shù)據(jù)流量大,系統(tǒng)的第一個(gè)查詢太慢。
為了提高Web2.0數(shù)據(jù)分頁(yè)的響應(yīng)速度,需要節(jié)省帶寬并盡可能加快查詢速度。查詢速度的提高,意味著在查詢數(shù)據(jù)庫(kù)時(shí),不用返回不需要的字段和記錄,僅返回必要的數(shù)據(jù)。網(wǎng)頁(yè)的主要任務(wù)是處理數(shù)據(jù)庫(kù),從而加快數(shù)據(jù)庫(kù)查詢的速度,這也是網(wǎng)站設(shè)計(jì)質(zhì)量的標(biāo)準(zhǔn)。MongoDB基于類(lèi)似于關(guān)系數(shù)據(jù)庫(kù)的索引機(jī)制來(lái)實(shí)現(xiàn)復(fù)雜的查詢。數(shù)據(jù)查詢速度高度依賴(lài)于索引的使用情況。根據(jù)查詢創(chuàng)建索引,并在必要時(shí)創(chuàng)建復(fù)合索引。MongoDB的查詢優(yōu)化方法簡(jiǎn)單明了。選擇索引后,可以提高性能。但是,反復(fù)選擇索引會(huì)產(chǎn)生一定量的開(kāi)銷(xiāo)并減慢它的查詢速度。因此,查詢可以通過(guò)在特定應(yīng)用程序場(chǎng)景中使用一個(gè)索引來(lái)獲得最佳性能,則可以使用MongoDB提供的提示功能在程序中指定索引,以避免對(duì)數(shù)據(jù)庫(kù)進(jìn)行不必要的嘗試[4]。
索引是數(shù)據(jù)庫(kù)將預(yù)先排序的數(shù)據(jù)合并為多種類(lèi)型的表的有效方法。在關(guān)系數(shù)據(jù)庫(kù)中對(duì)表進(jìn)行科學(xué)合理的索引編制,對(duì)于提高查詢數(shù)據(jù)庫(kù)數(shù)據(jù)的速度和優(yōu)化數(shù)據(jù)庫(kù)功能具有很大的作用。每種索引類(lèi)型的應(yīng)用程序均根據(jù)磁盤(pán)容量進(jìn)行調(diào)整。應(yīng)用索引時(shí),數(shù)據(jù)庫(kù)需要同時(shí)讀取兩種類(lèi)型的數(shù)據(jù)信息,兩種類(lèi)型的數(shù)據(jù)都被讀取為需要輸入數(shù)據(jù)庫(kù)的信息。讀取第一類(lèi)數(shù)據(jù)作為實(shí)際數(shù)據(jù)的索引。在數(shù)據(jù)指針和第二個(gè)數(shù)據(jù)類(lèi)型指針的特定方向上進(jìn)行讀取。因此,創(chuàng)建的索引應(yīng)能夠與實(shí)際應(yīng)用程序系統(tǒng)的查詢要求有效集成,以實(shí)現(xiàn)查詢優(yōu)化目標(biāo)。
在關(guān)系數(shù)據(jù)庫(kù)中,必須科學(xué)地應(yīng)用索引,并且必須遵循以下規(guī)則:在連接到通道但未設(shè)置為外鍵的列上配置索引,鏈接的字段將通過(guò)幫助自動(dòng)建立索引。在建立索引的情況下,無(wú)論配置,維護(hù)和運(yùn)行鏈接如何,都可以按照代償行為創(chuàng)建關(guān)系數(shù)據(jù)庫(kù),因此科學(xué)地應(yīng)用索引非常必要。錯(cuò)誤的索引不僅不利于優(yōu)化數(shù)據(jù)庫(kù)的性能,而且會(huì)對(duì)輸出產(chǎn)生負(fù)面影響。
在索引優(yōu)化中,必須實(shí)現(xiàn)索引的包容性和漸進(jìn)式。所謂的包容性意味著查詢中的索引指針必須指向所有索引內(nèi)容,且不能重復(fù)和遺漏,并且必須對(duì)索引中的每個(gè)語(yǔ)句進(jìn)行單獨(dú)分析,然后進(jìn)行合并和分析以實(shí)現(xiàn)索引。所謂漸進(jìn)式意味著已經(jīng)從索引中刪除或添加的某些選項(xiàng)也必須添加到索引的范圍中,并且隨著時(shí)間的推移,查詢內(nèi)容變化的部分在索引中也可以是準(zhǔn)確的展示。索引優(yōu)化還可以優(yōu)化數(shù)據(jù)庫(kù)的結(jié)構(gòu)。良好的索引優(yōu)化可以在屬性之間的互連方面對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提出更高的要求,以實(shí)現(xiàn)順暢的查詢和數(shù)據(jù)庫(kù)的合理設(shè)計(jì)[5]。
應(yīng)該簡(jiǎn)化或避免對(duì)大型列表進(jìn)行多次排序。如果可以使用索引自行生成輸出,則優(yōu)化器不需要經(jīng)過(guò)排序過(guò)程。但是,如果索引中等待排序的列不超過(guò)一列,則group by或order by子句中的列順序和索引順序之間會(huì)有所不同,并且來(lái)源也會(huì)有所不同,這就需要做列排序。添加索引以避免不必要的排序是科學(xué)合并數(shù)據(jù)庫(kù)表的一種非常有效的方法,有時(shí)會(huì)影響列表的美觀,但可以大大提高效率。如果需要進(jìn)行排序,應(yīng)積極尋求簡(jiǎn)化措施,例如縮小排序范圍。
LIKE具有字符串匹配功能,但是構(gòu)造工作很耗時(shí)且需要大量的人力資源。例如,SELECT * FROM student WHERE xh LIKE“05%”即便是于xh字段上構(gòu)建索引,在這種情況下,也應(yīng)該應(yīng)用順序掃描模式,并避免子字符串不啟動(dòng)。例如:SELECT * FROM Student WHERE xm LIKE“ Eryo%”,因?yàn)閣here子句中使用了非起始子字符串,因此這一語(yǔ)句不會(huì)應(yīng)用索引。
在數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)階段,將范式用于標(biāo)準(zhǔn)化基礎(chǔ)表,即范式優(yōu)化。在范式優(yōu)化中,主要的邏輯設(shè)計(jì)是遵守第三范式,消除功能依賴(lài)關(guān)系,并避免傳遞依賴(lài)關(guān)系。第三范式主要優(yōu)點(diǎn)是消除了大量備份數(shù)據(jù)對(duì)操作的負(fù)面影響。同時(shí),沒(méi)有改變數(shù)據(jù)庫(kù)中對(duì)象之間的相關(guān)關(guān)系,確保數(shù)據(jù)庫(kù)不受其他方面的負(fù)面影響,可以說(shuō)這是一種非常全面的初始設(shè)計(jì)方法。在數(shù)據(jù)存儲(chǔ)和備份之間找到了很好的平衡,在開(kāi)發(fā)階段克服了先前的優(yōu)化缺陷,并形成了更完整的起點(diǎn)。
當(dāng)然,范式優(yōu)化并非沒(méi)有缺點(diǎn)。在范式優(yōu)化中,級(jí)別不斷上升,冗余和更新異常等許多不合理的操作情況已消失,但是隨著級(jí)別的上升,上一級(jí)別的關(guān)系模式不斷地來(lái)回分解,關(guān)系的數(shù)量不斷增加,導(dǎo)致連接復(fù)雜。由于復(fù)雜的連接而導(dǎo)致操作消耗增加,操作可行性降低,數(shù)據(jù)庫(kù)的負(fù)擔(dān)增加,并且在嚴(yán)重的情況下,可能會(huì)影響數(shù)據(jù)庫(kù)的正常運(yùn)行。因此,范式優(yōu)化是一個(gè)適度的過(guò)程,對(duì)關(guān)系的連接的合理分配是優(yōu)化的邊界,需要在兩者之間找到平衡,為操作帶來(lái)便利和實(shí)用性[6]。
在查詢過(guò)程中,通常在某些固定查詢模式下獲得的句子結(jié)果會(huì)有所不同。查詢優(yōu)化是一種查詢階段的優(yōu)化技術(shù),通過(guò)查詢優(yōu)化,可以在各種執(zhí)行策略中選擇最合理,最合適的執(zhí)行策略,從而提高查詢的準(zhǔn)確性和效率。
在查詢優(yōu)化的過(guò)程中,許多程序員只注重復(fù)雜而美觀的界面,忽略了查詢效率,并導(dǎo)致許多開(kāi)發(fā)應(yīng)用程序中的查詢效率低下和資源浪費(fèi)過(guò)多。因此,如何在查詢優(yōu)化中做好工作已成為程序員當(dāng)前面臨的主要問(wèn)題。在設(shè)計(jì)查詢過(guò)程時(shí),首先要確保語(yǔ)句合理,高效和方便,還需要注意不要對(duì)大型表進(jìn)行重復(fù)排序。如果不可避免,則應(yīng)簡(jiǎn)化重復(fù)的對(duì)齊方式。
綜上所述,為了有效地增加數(shù)據(jù)庫(kù)存儲(chǔ)容量并確保系統(tǒng)良好,需要設(shè)計(jì)良好的使用分頁(yè)技術(shù)來(lái)提高查詢效率,從而有效地確保數(shù)據(jù)庫(kù)系統(tǒng)的穩(wěn)定運(yùn)行。隨著數(shù)據(jù)庫(kù)技術(shù)的不斷創(chuàng)新,掌握數(shù)據(jù)庫(kù)查詢優(yōu)化技能和創(chuàng)建可執(zhí)行的查詢計(jì)劃,可以極大地提高數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的功能,提高人們的工作效率。