李亞楠
摘 ?要:在進(jìn)行大數(shù)據(jù)處理軟件或WEB站點(diǎn)設(shè)計(jì)時(shí),數(shù)據(jù)庫(kù)訪問效率是用戶對(duì)軟件的基本要求,也是判斷一個(gè)軟件是否優(yōu)良的重要標(biāo)準(zhǔn)。本文將從數(shù)據(jù)庫(kù)設(shè)計(jì)、連接方式和數(shù)據(jù)檢索方式三個(gè)方面來簡(jiǎn)單介紹幾點(diǎn)提高數(shù)據(jù)庫(kù)訪問效率的辦法。
關(guān)鍵詞:數(shù)據(jù)庫(kù);效率;索引;SQL查詢
1、引言
隨著公司產(chǎn)品的發(fā)展,測(cè)試數(shù)據(jù)數(shù)據(jù)量的逐漸增大,數(shù)據(jù)庫(kù)以其數(shù)據(jù)共享、數(shù)據(jù)冗余度低、數(shù)據(jù)獨(dú)立性高、數(shù)據(jù)集中度高和數(shù)據(jù)一致性及可維護(hù)性高的五大優(yōu)點(diǎn),已經(jīng)成為了公司軟件進(jìn)行大量、復(fù)雜數(shù)據(jù)處理的必選工具。因此,如何提高數(shù)據(jù)庫(kù)訪問效率也就成為了軟件設(shè)計(jì)時(shí)需要重要考慮的問題之一,如處理不當(dāng),則會(huì)導(dǎo)致軟件運(yùn)行速度慢、系統(tǒng)卡死等重大問題。
2、數(shù)據(jù)庫(kù)設(shè)計(jì)
2.1 使用分布式數(shù)據(jù)庫(kù)
分布式數(shù)據(jù)庫(kù),顧名思義,也就是數(shù)據(jù)庫(kù)中的數(shù)據(jù)不是存儲(chǔ)在同一場(chǎng)地,而是分布存儲(chǔ)在多個(gè)場(chǎng)地。例如,長(zhǎng)慶油田的數(shù)字化系統(tǒng)即采用了分布式數(shù)據(jù)庫(kù),由每個(gè)站點(diǎn)來管理該站下油井的基礎(chǔ)數(shù)據(jù)和測(cè)試數(shù)據(jù),然后通過數(shù)據(jù)同步技術(shù)來將本站所管理數(shù)據(jù)與廠級(jí)中心服務(wù)器進(jìn)行數(shù)據(jù)同步。這種設(shè)計(jì)方案的優(yōu)點(diǎn)是,局部應(yīng)用的響應(yīng)速度較快,可擴(kuò)展性好,易于集成現(xiàn)有的系統(tǒng)。如公司要進(jìn)行大量、多層次的數(shù)字化產(chǎn)品安裝及系統(tǒng)實(shí)施,分布式數(shù)據(jù)庫(kù)將是一個(gè)很好的數(shù)據(jù)處理技術(shù)方案。
2.2 分類拆分?jǐn)?shù)據(jù)量大的表
對(duì)于經(jīng)常使用的數(shù)據(jù)表,由于其使用頻率很高,要盡量減少表中的記錄數(shù)量。例如,在功圖計(jì)產(chǎn)軟件中,將油井的計(jì)產(chǎn)參數(shù)細(xì)分為:靜態(tài)參數(shù)表、動(dòng)態(tài)參數(shù)表、原油物性表。這樣既提高了數(shù)據(jù)庫(kù)的訪問效率,又提高了軟件的可維護(hù)性。
2.3 應(yīng)用“三少”原則
1)數(shù)據(jù)庫(kù)中的表越少越好。只有數(shù)據(jù)庫(kù)中表的個(gè)數(shù)少了,才能說明系統(tǒng)的E-R圖少而精,去掉了重復(fù)的、多余的實(shí)體,形成了對(duì)客觀世界的高度抽象,進(jìn)行了系統(tǒng)的數(shù)據(jù)集成;
2)一個(gè)表中組合主鍵的字段個(gè)數(shù)越少越好。因?yàn)橹麈I的作用,一是建立主鍵索引,二是作為字表的外鍵,所以組合主鍵的字段個(gè)數(shù)少了,不僅節(jié)省了運(yùn)行時(shí)間,而且節(jié)省了索引存儲(chǔ)空間。
3)一個(gè)表中的字段個(gè)數(shù)越少越好。只有字段的個(gè)數(shù)少了,才能說明在系統(tǒng)中不存在數(shù)據(jù)重復(fù),且很少有數(shù)據(jù)冗余,更重要的是督促使用者進(jìn)行“列變行”,這樣就防止了將子表中的字段拉入到主表中去,在主表中留下許 多空余的字段。所謂“列變行”,就是將主表中的一部分內(nèi)容拉出去,另外單獨(dú)建一個(gè)子表。
2.4、創(chuàng)建索引
索引就是加快檢索表中數(shù)據(jù)的方法。數(shù)據(jù)庫(kù)的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個(gè)書就能迅速地找到所需要的信息。在數(shù)據(jù)庫(kù)中,索引也允許數(shù)據(jù)庫(kù)程序迅速地找到表中的數(shù)據(jù),而不必掃描整個(gè)數(shù)據(jù)庫(kù)索引具有以下5點(diǎn)優(yōu)點(diǎn):
1)創(chuàng)建唯一性索引,保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性
2)大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因
3)加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
4)在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。
5)通過使用索引,可以在查詢的過程中使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
為了提高數(shù)據(jù)庫(kù)訪問效率,在創(chuàng)建索引時(shí),一定要遵循以下幾條原則:
1)表的主鍵、外鍵必須有索引;
2)數(shù)據(jù)量超過300的表應(yīng)該有索引;
3)經(jīng)常與其他表進(jìn)行連接的表,在連接字段上應(yīng)該建立索引;
4)經(jīng)常出現(xiàn)在Where子句中的字段,特別是大表的字段,應(yīng)該建立索引;
5)索引應(yīng)該建在選擇性高的字段上;
6)索引應(yīng)該建在小字段上,對(duì)于大的文本字段甚至超長(zhǎng)字段,不要建索引;
7)復(fù)合索引的建立需要進(jìn)行仔細(xì)分析;盡量考慮用單字段索引代替:
A、正確選擇復(fù)合索引中的主列字段,一般是選擇性較好的字段;
B、復(fù)合索引的幾個(gè)字段是否經(jīng)常同時(shí)以AND方式出現(xiàn)在Where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復(fù)合索引;否則考慮單字段索引;
C、如果復(fù)合索引中包含的字段經(jīng)常單獨(dú)出現(xiàn)在Where子句中,則分解為多個(gè)單字段索引;
D、如果復(fù)合索引所包含的字段超過3個(gè),那么仔細(xì)考慮其必要性,考慮減少?gòu)?fù)合的字段;
E、如果既有單字段索引,又有這幾個(gè)字段上的復(fù)合索引,一般可以刪除復(fù)合索引;
8)頻繁進(jìn)行數(shù)據(jù)操作的表,不要建立太多的索引;
9)刪除無用的索引,避免對(duì)執(zhí)行計(jì)劃造成負(fù)面影響;
10)索引分為聚集索引和非聚集索引,應(yīng)根據(jù)具體所需查詢條件來建立合適類型的索引。
3、數(shù)據(jù)庫(kù)連接方式
傳統(tǒng)的數(shù)據(jù)庫(kù)連接方式,在動(dòng)態(tài)WEB站點(diǎn)運(yùn)行時(shí),會(huì)頻繁的建立和釋放連接,降低數(shù)據(jù)庫(kù)訪問效率,增加系統(tǒng)的負(fù)擔(dān),成為了軟件運(yùn)行效率的瓶頸。而數(shù)據(jù)庫(kù)連接池則是將已經(jīng)創(chuàng)建好的連接保存在池中,當(dāng)有請(qǐng)求來時(shí),直接使用已經(jīng)創(chuàng)建好的連接對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問。這樣省略了創(chuàng)建連接和銷毀連接的過程,在性能上得到了提高。
數(shù)據(jù)庫(kù)連接池的工作機(jī)制為,當(dāng)服務(wù)器啟動(dòng)時(shí)會(huì)建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳顺绦蛐枰B接時(shí),池驅(qū)動(dòng)程序會(huì)返回一個(gè)未使用的池連接并將其表記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動(dòng)程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個(gè)連接。
4、數(shù)據(jù)檢索方式
數(shù)據(jù)檢索的優(yōu)化主要是根本數(shù)據(jù)庫(kù)的設(shè)計(jì)方案和查詢條件來設(shè)計(jì)相應(yīng)的SQL查詢方案,從而減少數(shù)據(jù)檢索時(shí)間,提高現(xiàn)有資源的利用率。優(yōu)化數(shù)據(jù)檢索的方法主要有以下幾種:
1)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描;
2)應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描;
3)應(yīng)盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描;
4)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描;
5)任何地方都不要使用 select * from t,用具體的字段列表代替“*”,不要返回用不到的任何字段;
6)在所有的存儲(chǔ)過程和觸發(fā)器的開始處設(shè)置 SET NOCOUNT ON,在結(jié)束時(shí)設(shè)置 SET NOCOUNT OFF。無需在執(zhí)行存儲(chǔ)過程和觸發(fā)器的每個(gè)語句后向客戶端發(fā)送 DONE_IN_PROC 消息;
7)盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理。
參考文獻(xiàn)
[1] ?施瓦茨,扎伊采夫,特卡琴科.高性能MySQL.電子工業(yè)出版社,2013