摘要:在當(dāng)前網(wǎng)上電子商務(wù)發(fā)展的如火如荼的場景下,高并發(fā),大數(shù)據(jù)量的情況下,需要對服務(wù)器,客戶端的實(shí)現(xiàn)做相應(yīng)的優(yōu)化。本文主要針對數(shù)據(jù)庫中對大數(shù)據(jù)量處理的實(shí)現(xiàn)和優(yōu)化方式做了闡述,包括數(shù)據(jù)庫設(shè)計,數(shù)據(jù)庫查詢優(yōu)化,算法優(yōu)化和高效的利用索引等方面。
關(guān)鍵詞:電子商務(wù);數(shù)據(jù)庫;大數(shù)據(jù)
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9599 (2012) 21-0000-02
1 研究背景
在目前的電子商務(wù)系統(tǒng)的需求中,高并發(fā)和大數(shù)據(jù)訪問的需求顯得格外重要。隨著電子商務(wù)系統(tǒng)得到用戶的認(rèn)可之后,訪問量會爆炸性的增長,比如淘寶網(wǎng)站做的“雙十一”活動,在一天之內(nèi)賣出了一百五十億的銷售量。而每年春運(yùn)時節(jié),鐵道部的售票網(wǎng)站則是創(chuàng)下了每天點(diǎn)擊5億以上的并發(fā)量。在這種高并發(fā),大數(shù)據(jù)量的訪問之下,如何保證在不斷完善功能和多元化發(fā)展的同時,如何應(yīng)對不斷上漲的訪問量,數(shù)據(jù)量是電子商務(wù)系統(tǒng)所需要面對的最大的挑戰(zhàn)。
而對于用戶而言,除了功能以外,電子商務(wù)系統(tǒng)網(wǎng)站的訪問速度,電子商務(wù)系統(tǒng)能否持續(xù)提供高質(zhì)量,高穩(wěn)定性的服務(wù),也是影響用戶使用感覺的重要因素。因此,如何保證在高并發(fā)量,大數(shù)據(jù)量訪問的情況下,電子商務(wù)系統(tǒng)的穩(wěn)定性,也是本文需要考慮的問題之一。
2 數(shù)據(jù)庫設(shè)計
要解決在研究背景中提出的問題,最主要的問題就是設(shè)計一個合理,高效的數(shù)據(jù)庫模型。數(shù)據(jù)庫模型設(shè)計是否合理,對客戶端,服務(wù)器端程序的編寫有難度的編寫有著較為明顯的影響,這還會關(guān)系到以后整個系統(tǒng)的運(yùn)行性能。因?yàn)樵谡麄€電子商務(wù)系統(tǒng)開始實(shí)施前,數(shù)據(jù)庫模型設(shè)計必須設(shè)計的完整準(zhǔn)確。
在系統(tǒng)設(shè)計的初期,例如系統(tǒng)分析,設(shè)計的階段,由于需要處理的數(shù)據(jù)小,負(fù)擔(dān)低,所以功能是否完備,是否完整實(shí)現(xiàn)經(jīng)常是我們主要考慮的問題,而性能的強(qiáng)弱我們往往忽視。這就導(dǎo)致了系統(tǒng)實(shí)際運(yùn)行達(dá)不到我們預(yù)期的目標(biāo),經(jīng)常出現(xiàn)的是:系統(tǒng)在運(yùn)行一段時間之后,性能往往降低,而這時重新設(shè)計系統(tǒng)往往是不可能的,我們只能在整個系統(tǒng)基礎(chǔ)上添添補(bǔ)補(bǔ),就好像打補(bǔ)丁一樣,同樣也需要花費(fèi)大量的人力物力資源資金(前面提到的淘寶活動和春運(yùn)火車票系統(tǒng)等均屬于這種情況)。一個較好的做法就是:在數(shù)據(jù)庫模型設(shè)計結(jié)束之后,我們可以分析可能會出現(xiàn)的系統(tǒng)的不足或者瓶頸,這可以通過建立完整的數(shù)據(jù)流圖來實(shí)現(xiàn),從而在設(shè)計的階段就進(jìn)可能解決以后出現(xiàn)的問題。
數(shù)據(jù)冗余往往卻是一把雙刃劍。我們知道,降低數(shù)據(jù)冗余可以再邏輯設(shè)計的時候精簡表間關(guān)聯(lián),可以使得數(shù)據(jù)庫的一致性,完整性得到保證,從而清楚表達(dá)表間,元素間關(guān)系。而這樣往往會帶來另一個問題的思考:那就是出現(xiàn)大數(shù)據(jù)表時,由于需要涉及到多個表之間的關(guān)聯(lián)查詢等,適當(dāng)?shù)臄?shù)據(jù)冗余卻可以使得性能在一定范圍內(nèi)提升,也會使得客戶端程序的編寫更為簡化。因?yàn)椋锢碓O(shè)計需要統(tǒng)籌考慮,往往我們做出的只是一個折衷的選擇。比如根據(jù)關(guān)聯(lián)表的大小以及數(shù)據(jù)的訪問速度等,我們可以適當(dāng)提高那些訪問頻率比較大的查詢表的數(shù)據(jù)冗余,雖然使得程序變得復(fù)雜,但是也提高了系統(tǒng)的響應(yīng)速度。因此設(shè)計人員在設(shè)計階段應(yīng)該統(tǒng)籌考慮,盡量得出一個較為均衡的結(jié)果。
除了上面的設(shè)計原則之外,還要注意表的設(shè)計問題,總的來說,有下面幾個原則:(1)數(shù)據(jù)行的長度不要超過8020字節(jié),如果超過這個長度的話在物理頁中這條數(shù)據(jù)會占用兩行從而造成存儲碎片,降低查詢效率。(2)如果可以同樣清楚表達(dá)某一數(shù)據(jù),盡量用數(shù)字類型的字段而不是字符串。這是出于提高查詢連接性能,以及存儲開銷方面考慮的。因?yàn)閿?shù)字型在搜索引擎中只需要比較一次。(3)對于不可變字符類型char和可變字符類型varchar都是8000字節(jié),char查詢快,但是耗存儲空間,varchar查詢相對慢一些但是節(jié)省存儲空間。在設(shè)計字段的時候可以靈活選擇,例如用戶名、密碼等長度變化不大的字段可以選擇CHAR,對于評論等長度變化大的字段可以選擇VARCHAR。
3 數(shù)據(jù)查詢的優(yōu)化
設(shè)計一個合理的電子商務(wù)系統(tǒng),大批次,大量的數(shù)據(jù)查詢是我們必須考慮的。比如在某銀行的業(yè)務(wù)記錄表中,有幾千萬上億條的數(shù)據(jù),頻繁的查詢會大大降低系統(tǒng)的性能。因此,在原有功能的基礎(chǔ)上,我們應(yīng)該向著以下幾點(diǎn)方向努力:降低數(shù)據(jù)庫訪問次數(shù);降低網(wǎng)絡(luò)的負(fù)載,例如通過搜索的改進(jìn)得到最小化結(jié)果集等;或者通過并行處理技術(shù),從而提高響應(yīng)速度;或者改進(jìn)SQL的索引排列等;算法的結(jié)果盡量簡單。
建立索引的重要性在小數(shù)據(jù)量的情況下影響往往沒有大數(shù)據(jù)量明顯。因?yàn)槿绻麤]有建立索引,那么需要查找某一條數(shù)據(jù),數(shù)據(jù)庫就需要進(jìn)行全盤掃描以查出所需結(jié)果。數(shù)據(jù)庫比較小的時候,這種全盤掃描對性能的影響比較?。欢?dāng)數(shù)據(jù)量達(dá)到數(shù)千萬條的時候,這種全表掃描的查詢性能就非常差了。
因此,在電子商務(wù)系統(tǒng)的大數(shù)據(jù)處理數(shù)據(jù)查詢的SQL語句中,必須對查詢語句做相應(yīng)的優(yōu)化,盡量避免全盤掃描,傾向于索引查詢。
關(guān)于數(shù)據(jù)查詢的優(yōu)化,一般按照下面幾點(diǎn)實(shí)現(xiàn):(1)對where子句的判斷應(yīng)該盡量避免使用1值。這將會導(dǎo)致引擎進(jìn)行全表掃描。(2)where子句中盡量避免使用!=或<>操作符,這也會導(dǎo)致引擎進(jìn)行全表掃描而放棄索引的使用。(3)where子句中盡量避免使用or,in,not in等來連接條件,這也會導(dǎo)致引擎進(jìn)行全表掃描而放棄索引的使用。(4)在索引過的字符數(shù)據(jù)中,要盡量避免使用非打頭字母搜索。這也使得引擎無法利用索引。(5)在某些必要情況下,強(qiáng)制使用某個索引,這是因?yàn)橐恍┣闆r,比如在where中使用參數(shù)將引發(fā)全表掃描。因?yàn)镾QL只有在運(yùn)行時才會解析局部變量,但優(yōu)化程序不能將訪問計劃的選擇推遲到運(yùn)行時;它必須在編譯時進(jìn)行選擇。需要注意的是,在編譯的時候,如果建立訪問計劃,那么變量的值還是未知,將會無法作為索引的輸入。(6)在where子句中應(yīng)盡量避免對字段進(jìn)行函數(shù)與表達(dá)式操作,這也會導(dǎo)致引擎進(jìn)行全表掃描而放棄索引的使用。
4 算法的優(yōu)化
(1)存儲過程的優(yōu)化。游標(biāo)由于效率較差,因此我們需要盡量避免它的使用;我們的標(biāo)準(zhǔn)是1萬行:即游標(biāo)操作的數(shù)據(jù)一般不超過1萬行,否則考慮改寫。通常情況下,基于集的方法我們要優(yōu)于基于游標(biāo)方法考慮。但游標(biāo)的方法在一些情況下卻是非常有效的,比如在對小型數(shù)據(jù)集使游標(biāo),通常要比其他方法更加有效,這個前面提到的臨時表類似。如果有充足的開發(fā)時間,我們可以把基于游標(biāo)的方法,基于集的方法通過比較,以得到更好的實(shí)現(xiàn)途徑。(2)客戶端,服務(wù)器端的算法優(yōu)化。盡量減少客戶端和服務(wù)器端的交互,減少服務(wù)器端查詢數(shù)據(jù)庫的次數(shù)。增強(qiáng)整個系統(tǒng)的并發(fā)處理能力和多線程處理的能力。
5 高效的利用索引
我們在以下兩種情況會考慮創(chuàng)建索引:維護(hù)被索引列的唯一性,為快速訪問表中數(shù)據(jù)提供策略。有兩種索引經(jīng)常在大型數(shù)據(jù)庫中使用:簇索引和非簇索引。它們之間的差別在于:沒有簇索引的表存儲數(shù)據(jù)是按照堆的形式,在表的尾部添加數(shù)據(jù);簇索引的表,是按照簇索引鍵順序存儲數(shù)據(jù),一個表只能存在一個簇索引。所以根據(jù)B樹結(jié)構(gòu),添加索引可以提高按索引列查詢速度,而會影響刪除,更新等操作的性能,在填充因子較大時候,影響更為明顯。因此,如果一個表中的索引較多,而我們卻要對其進(jìn)行頻繁的更新,刪除等操作,那么我們在建立索引時應(yīng),填充因子應(yīng)盡量小。這種做法可以再各數(shù)據(jù)頁保留較多自由空間,以簡化以后的組織操作。
6 總結(jié)
本文首先針對電子商務(wù)中高并發(fā),大數(shù)據(jù)量的特性做了描述,然后從數(shù)據(jù)庫設(shè)計,數(shù)據(jù)庫查詢優(yōu)化,算法優(yōu)化和高效的利用索引這幾個方面對電子商務(wù)系統(tǒng)中大批量數(shù)據(jù)的方法進(jìn)行了闡述,對數(shù)據(jù)庫大數(shù)據(jù)處理有一定的指導(dǎo)意義。
參考文獻(xiàn):
[1]薩師炫.數(shù)據(jù)庫系統(tǒng)概論(第三版)[M].北京:高等教育出版社,2001.
[2]陳志泊.數(shù)據(jù)庫原理及應(yīng)用教程[M].北京:人民郵電出版社,2002.
[3]W.H.Inmon.數(shù)據(jù)倉庫[M].王志海.北京:機(jī)械工業(yè)出版社,2000.