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