李雋
(內(nèi)江職業(yè)技術(shù)學(xué)院 信息技術(shù)系,四川 內(nèi)江 641002)
隨著Internet技術(shù)的急速發(fā)展,基于B/S模式信息管理系統(tǒng)在各行業(yè)的運(yùn)用也越來(lái)越廣泛。數(shù)據(jù)庫(kù)作為信息系統(tǒng)裝載信息的載體,它夠有效地對(duì)數(shù)據(jù)進(jìn)行作存儲(chǔ)、管理和使用。它是保障信息技術(shù)系統(tǒng)能夠正常運(yùn)轉(zhuǎn)的必備條件。針對(duì)基于B/S模式信息管理系統(tǒng),用戶往往是通過(guò)網(wǎng)絡(luò)去訪問(wèn)數(shù)據(jù)庫(kù),存在大量用戶并發(fā)使用。這也使得基于B/S的系統(tǒng)在數(shù)據(jù)庫(kù)響應(yīng)效率上會(huì)較C/S系統(tǒng)有更進(jìn)一步的要求[1-2]。
無(wú)論哪種模式的信息系統(tǒng),往往存在大量用戶同時(shí)訪問(wèn)的情況。相比之下,基于B/S模式信息系統(tǒng)用戶往往通過(guò)網(wǎng)絡(luò)訪問(wèn)數(shù)據(jù)庫(kù),這會(huì)使得并發(fā)請(qǐng)求劇增。數(shù)據(jù)庫(kù)響應(yīng)效率往往會(huì)受到影響,有時(shí)甚至可能產(chǎn)生系統(tǒng)崩潰。
系統(tǒng)開(kāi)發(fā)之初,我們?cè)O(shè)計(jì)數(shù)據(jù)庫(kù)往往更多的去強(qiáng)調(diào)的是功能的實(shí)現(xiàn)。忽略了對(duì)數(shù)據(jù)庫(kù)的優(yōu)化。等到系統(tǒng)真正投入運(yùn)行之后再去考慮提高系統(tǒng)應(yīng)性能。只能更多的通過(guò)對(duì)硬件資源進(jìn)行升級(jí),這樣直接造成硬件資源消耗大,反而會(huì)花費(fèi)更多的人力,財(cái)力去解決問(wèn)題[3]。
sql語(yǔ)句有不同的寫(xiě)法。在性能上差異很大。這也會(huì)直接影響系統(tǒng)運(yùn)行的效率。復(fù)雜的代碼,可讀性差,后期維護(hù)費(fèi)時(shí)費(fèi)力。
數(shù)據(jù)庫(kù)的優(yōu)化通??梢酝ㄟ^(guò)對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)、網(wǎng)絡(luò)硬件,操作系統(tǒng),數(shù)據(jù)庫(kù)參數(shù)及應(yīng)用程序優(yōu)化來(lái)進(jìn)行[4-6]。
數(shù)據(jù)庫(kù)管理系統(tǒng)在設(shè)計(jì)使用過(guò)程中提供了大量的系統(tǒng)配置參數(shù)。例如:緩沖區(qū)、內(nèi)存分配、物理塊的大小、文件大小、增量大小等等一般在建立數(shù)據(jù)庫(kù)是系統(tǒng)都提供了默認(rèn)的參數(shù)值。但是應(yīng)該根據(jù)具體系統(tǒng)不同,具體的應(yīng)用環(huán)境不同,做出適當(dāng)?shù)恼{(diào)整以達(dá)到性能最優(yōu)[7]。
數(shù)據(jù)庫(kù)在設(shè)計(jì)的過(guò)程當(dāng)中,應(yīng)遵守規(guī)劃規(guī)范化設(shè)計(jì)的三范式原則。字段的設(shè)計(jì),類型的選取,字段完整性應(yīng)該盡量?jī)?yōu)化。
主鍵的設(shè)置最好和業(yè)務(wù)無(wú)關(guān),針對(duì)存在兩個(gè)以上鍵的表最好選用小的字段為主鍵,另外,針對(duì)合主鍵,字段的次序也很重要,一般重復(fù)率低、單獨(dú)或者查詢可能性大的字段會(huì)放置在靠前的位置,便于提高查詢效率速度。
另外,為字段設(shè)置數(shù)據(jù)類型時(shí),多種數(shù)據(jù)類型均可表示的字段則盡量選用長(zhǎng)度少的數(shù)據(jù)類型進(jìn)行設(shè)計(jì),數(shù)值類型和字符類均可表示時(shí)盡量使用數(shù)據(jù)類型。除此以外,為避免影響數(shù)據(jù)遷徙,設(shè)計(jì)中自增字段也應(yīng)慎用。
索引是一種單獨(dú)的、物理的對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種存儲(chǔ)結(jié)構(gòu)。適當(dāng)合理的構(gòu)建索引,是數(shù)據(jù)庫(kù)優(yōu)化的手段之一[8]。
在查詢的過(guò)程中,構(gòu)建唯一索引可以確保數(shù)據(jù)唯一性,加快數(shù)據(jù)的檢索速度,加速表和表之間的連接并顯著地減少查詢當(dāng)中的分組和排序的時(shí)間。
構(gòu)建索引時(shí),首先選擇查詢和表連接中頻繁使用的屬性列,一般主鍵和外鍵大部分是這樣的屬性列。所以,選用更新少、查詢語(yǔ)句中出現(xiàn)頻繁的列構(gòu)建索引。例如:學(xué)生表中學(xué)號(hào)、身份證號(hào)字段。
但是索引的建立在增加查詢的速度的同時(shí)也降低了數(shù)據(jù)更新的速度,因?yàn)樾碌臄?shù)據(jù)不僅要增加到表中也要增加到索引中。另外,創(chuàng)建索引還需要占用額外的物理磁盤空間,而維護(hù)索引需要耗費(fèi)時(shí)間,并且這種時(shí)間和索引數(shù)量的成正比。所以因此對(duì)于很少作為查詢條件使用的字段,經(jīng)常更新的字段以及字段值少分布嚴(yán)重不均勻的字段都應(yīng)當(dāng)避免將其設(shè)置成索引[9]。
數(shù)據(jù)庫(kù)中的數(shù)據(jù),最終存儲(chǔ)在物理磁盤上??梢酝ㄟ^(guò)以下方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行物理設(shè)優(yōu)化,達(dá)到存取時(shí)間的高效空間利用率高,并保證數(shù)據(jù)安全。
2.4.1 分離數(shù)據(jù)庫(kù)內(nèi)容
根據(jù)數(shù)據(jù)庫(kù)中數(shù)據(jù)內(nèi)容被應(yīng)用程序使用的情況將數(shù)據(jù)庫(kù)分為的易變部分和穩(wěn)定部分。有效提高數(shù)據(jù)的訪問(wèn)和使用效率
2.4.2 分開(kāi)存放文件
將一個(gè)完整信息系統(tǒng)中的數(shù)據(jù)庫(kù)系統(tǒng)文件和數(shù)據(jù)庫(kù)管理系統(tǒng)文件分別存放在不同位置達(dá)到優(yōu)化存儲(chǔ)的效果。
2.4.3 使用臨時(shí)表和視圖
在主表中數(shù)據(jù)不會(huì)頻繁修改的情況下將一個(gè)表所包含的子集重新進(jìn)行排序,并創(chuàng)建臨時(shí)表。適當(dāng)運(yùn)用這些過(guò)渡臨時(shí)表有助于避免多種排序操作,可減少系統(tǒng)輸入輸出操作,減少查詢工作量,加速查詢。
如果說(shuō)前面的優(yōu)化能解決數(shù)據(jù)庫(kù)40%的效率問(wèn)題,那么剩下的60%來(lái)源于對(duì)應(yīng)用程序的優(yōu)化。對(duì)程序源代碼的優(yōu)化往往涉及到對(duì)程序邏輯的改變,這樣會(huì)加大系統(tǒng)的時(shí)間成本和風(fēng)險(xiǎn),而且對(duì)數(shù)據(jù)庫(kù)性能的提升收效甚微。相比之下,sql語(yǔ)句是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的唯一途徑。因此對(duì)sql語(yǔ)句的優(yōu)化無(wú)疑成為了提升數(shù)據(jù)庫(kù)系統(tǒng)的性能的最佳選擇。
在SQL中,同一功能往往可以由不同的操作符實(shí)現(xiàn),但執(zhí)行的效率卻大相徑庭,因此,合理的使用各種操作符也能提高系統(tǒng)性能。比如:
3.1.1 使用not null操作符
數(shù)據(jù)庫(kù)中,含null值的字段是不能構(gòu)建索引的,即使對(duì)該字段建立了索引,只要某行上出現(xiàn)null值,索引也不能使用。此時(shí)可將空字段用not null或者默認(rèn)值替代,便于提高效率。
3.1.2 正確使用like通配符
like是使用通配符進(jìn)行模糊查詢的語(yǔ)句,里面的通配符可任意組合,產(chǎn)生多個(gè)查詢結(jié)果,但使用格式不同則會(huì)影響性能。如stuname like ‘%張三%’和stuname like ‘張三%’。若stuname字段構(gòu)建有索引,則查詢時(shí)時(shí),前者不會(huì)使用數(shù)據(jù)庫(kù)索引,而后者則會(huì)使用數(shù)據(jù)庫(kù)索引[10]。
3.1.3 少用union操作符
在表合并中,union操作符是用來(lái)合并查詢結(jié)果的。執(zhí)行該操作,先獲取兩個(gè)查詢結(jié)果,在對(duì)結(jié)果進(jìn)行去重復(fù)記錄,排序等形成新的結(jié)果集,最后返回結(jié)果集。但一旦查詢結(jié)果數(shù)據(jù)量大,合并起來(lái),執(zhí)行效率會(huì)受到明顯的影響。
數(shù)據(jù)庫(kù)操作時(shí),where子句若包含函數(shù)計(jì)算,那該行索引無(wú)法使用,勢(shì)必會(huì)觸發(fā)全表記錄逐行掃描,嚴(yán)重影響運(yùn)行效率。
selelct *提取所有字段所需容量大,執(zhí)行效率低。使用查詢時(shí),盡量根據(jù)系統(tǒng)需要設(shè)置查詢的詳細(xì)字段,提高查詢效率。
除此之外正確合理的使用簇,建立索引表,散列表索引等邏輯結(jié)構(gòu)也可以加快系統(tǒng)的檢索效率。從而到達(dá)提高系統(tǒng)運(yùn)行效率。
各種基于B/S模式的信息系統(tǒng)在設(shè)計(jì)和建立數(shù)據(jù)庫(kù)時(shí),必須充分考慮到系統(tǒng)本身的功能和性能需求,結(jié)合實(shí)際情況,建立符合用戶需求的數(shù)據(jù)庫(kù)。優(yōu)化數(shù)據(jù)庫(kù)是提高系統(tǒng)性能的必不可少的環(huán)節(jié)之一。一個(gè)B/S模式的信息系統(tǒng)并發(fā)業(yè)務(wù)數(shù)據(jù)的量大,如果對(duì)當(dāng)中的數(shù)據(jù)庫(kù)優(yōu)化不夠,就需要消耗更多的硬件資源來(lái)維護(hù)和滿足系統(tǒng)的運(yùn)行。因此,優(yōu)秀的數(shù)據(jù)庫(kù)優(yōu)化將為整個(gè)業(yè)務(wù)系統(tǒng)執(zhí)行效率帶來(lái)很大的提升,減少數(shù)據(jù)庫(kù)死鎖的風(fēng)險(xiǎn),降低數(shù)據(jù)庫(kù)維護(hù)的成本。