摘 要:數(shù)據(jù)庫系統(tǒng)是管理信息系統(tǒng)的核心,而數(shù)據(jù)庫所存儲的數(shù)據(jù)則更是我們電腦用戶最重要的個人信息資源,不僅對個人,現(xiàn)如今在銀行、企業(yè)、政府等部門也得到了廣泛的應(yīng)用。文章主要介紹了數(shù)據(jù)庫的查詢優(yōu)化的方法,以便于更加快捷、高效地將數(shù)據(jù)庫應(yīng)用于社會生產(chǎn)實(shí)踐。
關(guān)鍵詞:數(shù)據(jù)庫;索引;優(yōu)化;SQL語句;效率
前言
隨著人類逐步跨入信息時代,我們每天都會處理大量信息。作為信息的載體和最佳表現(xiàn)形式——數(shù)據(jù)的共享性同時也要求數(shù)據(jù)會被大量的搜索查詢,所以對數(shù)據(jù)庫進(jìn)行查詢優(yōu)化在當(dāng)下顯得尤為重要。 但是當(dāng)數(shù)據(jù)的數(shù)量積累到一定的程度時,全部掃描一次往往需要很長的時間,對其進(jìn)行統(tǒng)計(jì)和整理更是一個相當(dāng)困難的工作。但是如果使用更加高明的查詢策略,往往可以大大降低查詢的工作時間,由此可見查詢優(yōu)化技術(shù)在數(shù)據(jù)庫的應(yīng)用中顯得多么得重要。
由于數(shù)據(jù)庫系統(tǒng)在管理信息系統(tǒng)中的核心地位,有關(guān)數(shù)據(jù)庫的各種分析處理也成為計(jì)算機(jī)應(yīng)用的最重要的部組成部分。從以往的經(jīng)驗(yàn)和數(shù)據(jù)統(tǒng)計(jì)來看,查詢操作是數(shù)據(jù)庫操作中使用頻率最高的,故如果在查詢過程中采取更為高明的查詢策略,一定可以減少查詢時間,提高工作效率。
1 基于索引的優(yōu)化
對數(shù)據(jù)庫進(jìn)行優(yōu)化的關(guān)鍵在于在各種各樣的優(yōu)化方法中找出最佳的優(yōu)化方法,即建立最優(yōu)的索引。
說白了,索引的根本目的就是為了提高查詢效率,所以要達(dá)到查詢的最優(yōu)化,那么將索引的使用恰到好處不失為一個高明的策略,而為了避免表掃描,并減少因?yàn)椴樵兌斐傻妮斎胼敵鲩_銷的一個重要方法就是建立索引,建立適合關(guān)系數(shù)據(jù)庫系統(tǒng)的索引。
(1) 建立恰當(dāng)?shù)乃饕紫犬?dāng)然要進(jìn)行正確的分析與判斷,以便使所創(chuàng)建的索引有助于數(shù)據(jù)庫工作效率的提高。我們可以這樣做來達(dá)到這些要求:判斷數(shù)據(jù)庫系統(tǒng)中哪些表的哪些字段要建立索引;不僅要整理出來那些常用且對性能有較大影響的語句,還要熟記數(shù)據(jù)庫程序中的相關(guān)SQL語句。其次,重點(diǎn)關(guān)注與其他表連接頻率高的、數(shù)據(jù)流量較大的表,并且在沒有指定為外鍵的列上建立索引,而對那些不經(jīng)常連接的字段可以通過優(yōu)化器自動生成索引形成列表來完成。
(2)此外在一些大型數(shù)據(jù)庫系統(tǒng)中還會經(jīng)常用到一些索引的使用方法,通過好的索引方法同樣可以將搜索時間大大縮減。所以利用好這些方法對于我們優(yōu)化索引是十分必要的。比如對有多個待排序的列可以在其基礎(chǔ)上建立復(fù)合索引,對進(jìn)行g(shù)roup by或order by等次數(shù)較多的操作也可以建立索引。
嘗試?yán)靡幌孪到y(tǒng)工具。在一些數(shù)據(jù)庫服務(wù)器上,索引可能因?yàn)轭l繁操作而使得讀取效率降低,如果遇到查詢時使用的索引突然慢下來,這時可以試著用dabchick工具檢查索引的完整性,并進(jìn)行簡單的修復(fù)。另外,當(dāng)數(shù)據(jù)庫表更新大量數(shù)據(jù)后,刪除并重建索引可以提高查詢速度;同時任何事情都有兩面性建立索引以求效率最大化的同時,索引作為一種實(shí)體,也會占系統(tǒng)一定的空間,就像360能清空垃圾但是本身也需要占一定的磁盤物理內(nèi)存一樣。所以必須一切從工作實(shí)際出發(fā),不照搬死方法,靈活運(yùn)用,這樣才能實(shí)現(xiàn)查詢最優(yōu)。
(3)簡化排序操作
需要注意的是,建立索引時最好應(yīng)該盡量簡化或避免對大型表進(jìn)行重復(fù)排序的操作。因?yàn)榕判虻牧衼碜圆煌乃詾榱吮苊獠槐匾呐判颍梢試L試著再建立一些適當(dāng)?shù)乃饕⒑侠淼睾喜?shù)據(jù)庫表。當(dāng)然盡管有時可能會影響表的規(guī)范化,但拿提高效率這一優(yōu)點(diǎn)來相比的話還是值得的。如果排序不可避免,那么可以試著簡化它,如縮小排序的列的范圍等。像group by或order by子句中列的次序與索引的次序不一樣、索引中不包括一個或幾個待排序的列等因素都可以通過這樣來達(dá)到優(yōu)化的效果。
(4)建立了合理的索引的同時,還要保證其能得到真正的使用,發(fā)揮其應(yīng)有的作用。就像拍電影,找到合適的演員不代表你就能把戲拍好,你還需要發(fā)揮每一位演員甚至群眾演員的優(yōu)點(diǎn)。首先如何確定所建立的索引是否真正得到了使用:可以通過SQL語句查詢,找出沒有使用到的索引:然后逐一進(jìn)行分析原因,并針對不同情況運(yùn)用相應(yīng)的解決方案,真正做到物盡其用。然后,索引可以被使用以后,還沒結(jié)束,你還得檢驗(yàn)索引是否達(dá)到了預(yù)期的效果,以免徒勞無功。看來不僅要建立適當(dāng)?shù)乃饕挥凶屗饕嘉锉M其用才能使數(shù)據(jù)庫的性能得到真正意義上的提高。
(5)避免相關(guān)子查詢
在進(jìn)行數(shù)據(jù)庫查詢時,最好避免數(shù)據(jù)的子查詢。當(dāng)然如果子查詢無法避免,那么就要另想辦法,比如在子查詢中過濾掉盡可能多的行。但這種方法多數(shù)情況下行不通。如果一個列的標(biāo)簽同時在主查詢和where子句中的查詢中出現(xiàn),那么很可能當(dāng)主查詢中的列值改變之后,子查詢就必須還得重新查詢一次。這樣查詢堆積的層越多,效率自然也就越低。因此最有效的方法還是盡量避免子查詢。
(6)用排序來取代非順序存取
其實(shí)如果我們能充分利用數(shù)據(jù)庫自身所具有的能力,同樣可以改進(jìn)查詢。例如可以利用數(shù)據(jù)庫的排序能力來替代非順序的存取。這是因?yàn)榉琼樞虼疟P存取是效率最為低下的操作,尤其在磁盤存取臂的來回移動時體現(xiàn)得更為明顯。為什么會出現(xiàn)這種情況呢?SQL語句隱藏了這一情況,使得我們在寫應(yīng)用程序時很容易寫出要求存取大量非順序頁的查詢。這時候?yàn)榱吮苊膺@一麻煩,取而代之的是運(yùn)用排序取代非順序來提高運(yùn)行速率。
(7)盡量避免不太容易的的正規(guī)表達(dá)式
正規(guī)表達(dá)式,即MATCHES和LIKE關(guān)鍵字支持通配符匹配的專業(yè)名詞。使用這種匹配時一般會特別耗費(fèi)時間。假如在這種字段上建立了索引,就算采用了合適的索引效率也不會得到明顯改善。如果把語句改為SELECT * FROM customer WHERE zip code >\"98000\",在執(zhí)行查詢時就會利用索引來查詢,那么顯然會大大提高查詢速度。
(8)注意消除對大型表行數(shù)據(jù)的順序存取
在嵌套查詢中,對表的順序存取對查詢效率可能會產(chǎn)生致命的影響。比如采用順序存取策略,一個嵌套3層的查詢,如果每層都查詢1000行,那么這個查詢就要查詢10億行數(shù)據(jù)。對于這種情況可以使用并集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的where子句強(qiáng)迫優(yōu)化器使用順序存取。避免這種情況的主要方法還有復(fù)合索引。例如,兩列表,第一個工人考勤表包括出勤率,工作情況,獎懲情況等,;第二個經(jīng)營責(zé)任人表包括工作情況、日程安排和經(jīng)營戰(zhàn)略等,這時對兩個表作鏈接就可以在工作情況這個數(shù)據(jù)上面進(jìn)行鏈接充分利用復(fù)合索引的優(yōu)勢。
2 優(yōu)化SQL語句
采用優(yōu)化SQL語句的方法在使用索引時可以有效的提高查詢速度,但是如果SQL語句使用不恰當(dāng)?shù)脑挘⒌乃饕粌H不能發(fā)揮其作用,更會適得其反。所以我們應(yīng)該做到不但會寫SQL,還要寫出性能優(yōu)良的SQL語句。下面進(jìn)行具體說明。
(1)首先,在進(jìn)行查詢時,返回的值應(yīng)該是查詢所需要的。在查詢中應(yīng)該盡量減少對數(shù)據(jù)庫中的表的訪問的行列數(shù)。
(2)其次,合理使用EXISTS, NOT EXISTS字句
(3)再次,對于一些特殊的SQL語句,在使用時應(yīng)正確選擇, 在對數(shù)據(jù)庫查詢時,所使用的語句多種多樣,但選擇恰當(dāng)?shù)牡淖志淠軌蛴行У奶岣卟樵冃省?/p>
3 結(jié)束語
事半功倍,是提高效率的金玉良言,對于數(shù)據(jù)庫的查詢優(yōu)化也是如此。針對數(shù)據(jù)查詢的特點(diǎn)進(jìn)行各個擊破,一一剖析,達(dá)到減少查詢時間的最優(yōu)效果,這就是數(shù)據(jù)庫查詢優(yōu)化的使命。