鄧平 李紅育 寧東玲
1云南財經(jīng)大學(xué)信息學(xué)院 云南 650000
2云南工商學(xué)院軟件學(xué)院 云南 651700
互聯(lián)網(wǎng)時代的Web系統(tǒng)在企業(yè)中的大量應(yīng)用,隨之而來的數(shù)據(jù)高速膨脹,使得海量數(shù)據(jù)的處理和檢索問題變的異常復(fù)雜。要存儲和處理海量信息,不僅需要有高速的網(wǎng)絡(luò)基礎(chǔ)設(shè)施,還需要處理海量信息的計(jì)算和存儲平臺,為了能高效可靠的存儲和處理PB級的海量數(shù)據(jù),對數(shù)據(jù)的存儲計(jì)算及檢索優(yōu)化技術(shù)應(yīng)運(yùn)而生。
在分布式數(shù)據(jù)庫中,由于數(shù)據(jù)的分布和冗余,使得查詢處理中需要考慮站點(diǎn)間傳輸數(shù)據(jù)的通信費(fèi)用,所以除了考慮CPU代價和I/O代價之外,還應(yīng)該包括數(shù)據(jù)在網(wǎng)絡(luò)上的傳輸代價。即總代價=CPU代價+I/O代價+通信代價。因此,分布式數(shù)據(jù)庫進(jìn)行分布式設(shè)計(jì)時,一個重要原則是使數(shù)據(jù)和應(yīng)用程序?qū)崿F(xiàn)最大程度的本地性,這樣就可以使應(yīng)用數(shù)據(jù)盡可能地本地化,以減少通信開支。對于建立在各場所的分布式數(shù)據(jù)庫,不需要過分進(jìn)行限制,但也必須要有規(guī)范的設(shè)計(jì)要求。
(1)硬件規(guī)范,必須支持局域網(wǎng)乃至Internet的包括聲音,文字,圖像的交流,支持IE或Netscape瀏覽web界面,支持開放性數(shù)據(jù)源的建立。
(2)數(shù)據(jù)庫形式規(guī)范,原則上Access、Paradox,甚至文本文件都可以進(jìn)行數(shù)據(jù)傳輸,但必須保證自己有開放式數(shù)據(jù)源的特征及關(guān)系繼承的特征。
(3)域的統(tǒng)一和分類、分科的統(tǒng)一,數(shù)據(jù)庫在各個分布場所必須有統(tǒng)一的域結(jié)構(gòu),以確保給用戶提供完整統(tǒng)一的視圖,科目分類的命名必須要求規(guī)范,以確保查詢和統(tǒng)計(jì)工作的準(zhǔn)確性,在方便工作的條件下,可以不要求唯一確定的主關(guān)鍵字。
數(shù)據(jù)庫服務(wù)器級,就是利用多臺數(shù)據(jù)庫服務(wù)器對數(shù)據(jù)進(jìn)行存儲。首先來看案例:我國目前有13多億人口,現(xiàn)在要開發(fā)一個系統(tǒng),能夠根據(jù)身份證號檢索出該人的詳細(xì)信息。對于這種海量數(shù)據(jù)的系統(tǒng),最有效的方式就是從數(shù)據(jù)庫服務(wù)器級進(jìn)行數(shù)據(jù)的分類存儲。如:我國居民身份證是由18位數(shù)字或字母組成,這些數(shù)字和字母都有實(shí)際意義,其中的前6位是行政區(qū)劃碼,可以把不同行政區(qū)劃的公民信息存儲到不同的數(shù)據(jù)庫服務(wù)器上,同時在系統(tǒng)中建立一個字典表,如表1所示。
表1 數(shù)據(jù)庫服務(wù)器字典表
當(dāng)輸入身份證號碼時,首先根據(jù)其前4位來檢索其行政區(qū)劃,然后再連接到其所對應(yīng)的數(shù)據(jù)庫服務(wù)器進(jìn)行檢索。
這種方式帶來的查詢結(jié)果是最高效的,數(shù)據(jù)存儲與查詢的優(yōu)化速度可以提升到10的次方級以上。
通常情況下,數(shù)據(jù)庫中的表是固定的。但有時,在系統(tǒng)的實(shí)際運(yùn)行過程中通過動態(tài)生成表卻能對大數(shù)據(jù)量的存儲與檢索起到不錯的效果。例如,要為某大學(xué)開發(fā)學(xué)工系統(tǒng),系統(tǒng)要能夠?qū)W(xué)生的日常操行進(jìn)行記錄。在系統(tǒng)中必然要有一張表來記錄學(xué)生的日常行為,而問題是對于上萬人的大學(xué),每天將有上萬條的記錄,而這些信息起碼要保存4年,數(shù)據(jù)將達(dá)到10000(人)X 300(天)X 4(年)=12000000條,如何能夠快速檢索出其中某個學(xué)生的操行記錄呢?
在系統(tǒng)開發(fā)中,可以采用動態(tài)表的形式來提升數(shù)據(jù)的檢索效率。具體做法是,系統(tǒng)中存在班級信息表,結(jié)構(gòu)如表2所示。
表2 班級信息表
改進(jìn)后的表3中添加了一列,叫做【操行記錄表】,該列是在添加班級信息時動態(tài)按照命名規(guī)則生成的,同時在數(shù)據(jù)庫中,也添加了一張表,即對應(yīng)的操行記錄表,該表用來保存該班級的操行信息。對于一個近萬人的大學(xué),假如每個班級按照50人核算,那么動態(tài)表的應(yīng)用就把操行記錄表的數(shù)據(jù)量縮小了近200倍,檢索效率也提升了近百倍。
表3 班級信息表
索引是關(guān)系數(shù)據(jù)庫中非常重要的對象,但大家往往忽略了索引對數(shù)據(jù)檢索的影響,這種影響在大型的或復(fù)雜的數(shù)據(jù)庫中尤為明顯。
下面將通過實(shí)際的數(shù)據(jù)檢索來給出實(shí)驗(yàn)結(jié)果。測試的環(huán)境為:主機(jī)HP Compaq 6515b;內(nèi)存:2G;操作系統(tǒng):Windows xp;數(shù)據(jù)庫:Microsoft SQL Server 2008。
首先,創(chuàng)建如圖1所示數(shù)據(jù)表。其次,向表中插入100萬條數(shù)據(jù)記錄。然后,通過如下SQL語句對檢索效率進(jìn)行測試。
圖1 數(shù)據(jù)表結(jié)構(gòu)
declare @begin datetime
set @begin = getdate()
select count(*)from T_record where
pubdate > '2012-01-04 15:58:00' and
pubdate < '2012-01-04 16:12:00'
print(datediff(ms,@begin,getdate()))
(1)索引對比
當(dāng)采用默認(rèn)索引執(zhí)行上述SQL檢索時,耗時為373ms;當(dāng)為pubdate列添加一個非聚集索引時,耗時為156ms;當(dāng)將默認(rèn)的聚集索引刪除,同時指定pubdate為聚集索引時,耗時為123ms。
雖然三種檢索的耗時都沒有超過1秒,但從結(jié)果可以發(fā)現(xiàn)第1種方式的耗時幾乎為后面第2種方式的2倍還多,而第3種方式最短。
分析:同樣的SQL檢索語句,由于第1種方式下,雖然指定了id為主鍵,創(chuàng)建了一個聚集索引,但由于檢索中并不根據(jù)id編號進(jìn)行檢索,所以該聚集索引等于沒有;而第2種方式時,為pubdate列創(chuàng)建了非聚集索引,其檢索用到了索引,從而提升了檢索效率;而第3種情形,為pubdate列創(chuàng)建聚集索引,而聚集索引是一種物理存儲與邏輯存儲一致的索引方式,故其檢索效率進(jìn)一步得到了提升。
(2)組合索引
首先,在pubdate、publisher兩列上創(chuàng)建組合索引,然后執(zhí)行如下SQL語句。
declare @begin datetime
set @begin = getdate()
select count(*)from T_record where
publisher in('u_1000','u_400000')
print(datediff(ms,@begin,getdate()))
執(zhí)行檢索共耗時1033ms,然后,對進(jìn)行索引修改,還是為pubdate和publisher創(chuàng)建組合索引,但順序調(diào)整為publisher、pubdate,然后執(zhí)行檢索共耗時16ms,幾乎為0。
分析:雖然都是在pubdate和publisher上創(chuàng)建的組合索引,但由于第一次的前導(dǎo)列是pubdate,但在查詢中并沒有用到pubdate列,所以組合索引沒有被使用,而第二次的前導(dǎo)列是publisher,檢索用到了索引,大大提升了效率。
總結(jié)一下,索引使用需要注意以下幾點(diǎn):
① 聚集索引是很寶貴的,一定要用到最合適的列上;
② 經(jīng)常同時存取多列,可考慮建立組合索引;
③ 組合索引要盡量使關(guān)鍵查詢形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。
通常,檢索只要能夠檢索到數(shù)據(jù)即可,而忽略了語句寫法不同對效率的影響??偟恼f來,在進(jìn)行檢索時,應(yīng)遵循的基本原則是盡量避免全表掃描。具體的來說就是需要注意以下幾點(diǎn):
① 盡量避免在where子句中對字段進(jìn)行null值判斷;
② 優(yōu)先考慮在where及order by涉及的列上建立索引;
③ 盡量避免在where子句中使用!=或<>操作符;
④ 盡量避免使用or來連接條件;
⑤ 盡量避免在where子句中對字段進(jìn)行表達(dá)式或函數(shù)操作。
根據(jù)分布式數(shù)據(jù)存儲、動態(tài)表、索引、查詢語句優(yōu)化等4個方面對海量數(shù)據(jù)的存儲與檢索分析得知,四者的有效結(jié)合可以極大的提高數(shù)據(jù)的存儲與檢索效率。因此,在實(shí)際應(yīng)用中,系統(tǒng)設(shè)計(jì)人員可以將這四者有機(jī)的結(jié)合起來,使之與IT系統(tǒng)部署在一起,從而能高效處理海量數(shù)據(jù)與檢索查詢。
[1]Tom White.Hadoop: The Definitive Guide.O’Reilly Media,Inc.2009.
[2]田穎,許魯.分布式文件系統(tǒng)中的負(fù)載平衡技術(shù).計(jì)算機(jī)工程.2003.
[3]Sun Microsystems,Inc.Lustre File System: High- Performance Storage Architecture and Scalable Cluster File System.www.sun.com.2007.
[4]陳曉明.分布式數(shù)據(jù)庫分片關(guān)系變換查詢優(yōu)化[J].電子設(shè)計(jì)工程.2011.
[5]陳殿偉.基于Hadoop的虛擬篩選海量數(shù)據(jù)存儲及結(jié)果處理的設(shè)計(jì)和實(shí)現(xiàn)[D].蘭州大學(xué).2012.
[6]譚懷遠(yuǎn).讓Oracle跑得更快2——基于海量數(shù)據(jù)的數(shù)據(jù)庫設(shè)計(jì)與優(yōu)化.電子工業(yè)出版社.2011.