国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

MongoDB分頁技術(shù)改進(jìn)與優(yōu)化

2015-12-31 17:20:52王振輝王振鐸王靜婷
計算技術(shù)與自動化 2015年3期

王振輝 王振鐸 王靜婷

摘要:隨著數(shù)據(jù)量的不斷增加,使用MongoDB數(shù)據(jù)庫內(nèi)置的skip和limit組合分頁算法效率低下,成為影響數(shù)據(jù)庫訪問性能提升的重要問題。從分析影響分頁查詢速度的關(guān)鍵因素入手,提出細(xì)粒度查詢改進(jìn)算法和where-limit算法。通過理論推導(dǎo)和與原算法的實驗結(jié)果的比較,分析了兩種新算法使用場景和優(yōu)缺點(diǎn)。將兩種算法應(yīng)用于實際Web2.0日志系統(tǒng)應(yīng)用中,取得了較好的效果。最后,對影響數(shù)據(jù)分頁的其它因素進(jìn)行了探討,以更好的提高Web應(yīng)用性能。

關(guān)鍵詞:MongoDB;數(shù)據(jù)分頁;索引;查詢

中圖分類號:TP311.13 文獻(xiàn)標(biāo)識碼:A

1引言

互聯(lián)網(wǎng)時代實際上是數(shù)據(jù)的時代,構(gòu)建web2.0應(yīng)用必然要涉及到海量數(shù)據(jù)的顯示,數(shù)據(jù)分頁顯示技術(shù)也是開發(fā)過程中經(jīng)常使用的數(shù)據(jù)顯示方法,數(shù)據(jù)分頁效率也是系統(tǒng)性能好壞的重要評價指標(biāo)。MongoDB由于具有快速、可擴(kuò)展性,豐富的編程接口及運(yùn)維方便等特點(diǎn),使其在大數(shù)據(jù)時代異軍突起,為web2.0應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。MongoDB中使用limit函數(shù)限制返回的結(jié)果數(shù),使用skip函數(shù)跳過指定條數(shù)的記錄,所以使用limit并結(jié)合skip能夠方便的實現(xiàn)數(shù)據(jù)分頁顯示。此種方法當(dāng)數(shù)據(jù)量和并發(fā)訪問量較小時,這樣做分頁完全沒有問題。但是當(dāng)數(shù)據(jù)量很大時,skip操作會變的很慢,所以有必要對MongoDB分頁技術(shù)進(jìn)行改進(jìn)和優(yōu)化,使得其在大數(shù)據(jù)查詢和顯示方面表現(xiàn)的更好。

目前,國內(nèi)外對MongoDB分頁技術(shù)改進(jìn)方法主要有以下幾種:一是限定結(jié)果集的頁數(shù),類似于搜索引擎結(jié)果分頁策略,如:百度、谷歌的方法。雖然,顯示找到的結(jié)果巨大,但用戶能查看的只能是前60-70頁的數(shù)據(jù),這種方法由于限定結(jié)果記錄在萬條以下,所以,獲取頁面數(shù)據(jù)速度快,但顯示的數(shù)據(jù)不全。第二種方法是把所有符合條件數(shù)據(jù)放在數(shù)組中,由于也是一次查詢數(shù)據(jù)庫,且放在內(nèi)存中,所以,提高了數(shù)據(jù)分頁的速度。但是,隨著結(jié)果集數(shù)據(jù)的增大,對主機(jī)內(nèi)存要求過大,容易造成內(nèi)存溢出,Web應(yīng)用穩(wěn)定性受到影響,同時一次性返回所有記錄,網(wǎng)絡(luò)數(shù)據(jù)通信量較大,系統(tǒng)首次查詢速度過慢。

2細(xì)粒度查詢改進(jìn)算法

2.1設(shè)計原理

MongoDB的查詢優(yōu)化方式簡單直接,以查詢模式為單位并行執(zhí)行多種查詢計劃,選取速度最快的。查詢模式的分類是按照查詢的條件和排序涉及的字段及順序進(jìn)行劃分的。其中排序字段的升序和降序?qū)?yīng)的是不同的查詢模式,選取的查詢計劃也不同,通常是相反的索引。MongoDB的查詢模式分類僅考慮查詢條件find和排序sort,并不考慮skip和limit函數(shù)。當(dāng)執(zhí)行查詢結(jié)果分頁顯示時,需要使用skip函數(shù)跳過一部分?jǐn)?shù)據(jù)。在海量數(shù)據(jù)下,當(dāng)實際要讀取的數(shù)據(jù)在sort排序的數(shù)據(jù)集后面時,skip的數(shù)量會很大,有時可以達(dá)到幾萬、十幾萬。遇到這樣skip數(shù)量的查詢,仍使用原sort排序的索引,速度會很慢。當(dāng)MongoDB檢測到該查詢計劃速度變慢時,會重新執(zhí)行查詢計劃選取,若檢測使用的查詢也是skip很大的,會導(dǎo)致選取錯誤的索引,造成該查詢模式正常查詢的速度變慢。

針對上述問題,本文提出細(xì)粒度查詢改進(jìn)算法:使用count函數(shù)計算總記錄數(shù),并計算數(shù)據(jù)頁數(shù),在分析查詢語句時,若有skip和limit操作,先計算跳過記錄offset在整個查詢結(jié)果集總數(shù)recno中占的百分比rate,若rate超過50%,則將該查詢語句劃分到反序的查詢模式,轉(zhuǎn)換為等價的反序的查詢,這樣就可以減少skip的數(shù)量,從而提高提高數(shù)據(jù)分頁顯示效率。算法改進(jìn)流程圖如下圖1所示。

下面的代碼給出了顯示數(shù)據(jù)的后臺核心代碼:

2.2實驗分析

為驗證細(xì)粒度查詢改進(jìn)算法的效果,本文以Web日志系統(tǒng)為例,在結(jié)果集記錄數(shù)recno分別為10萬,30萬,50萬,比率rate分別為50%,55%,60%,80%的情況下,測試算法優(yōu)化前后的頁面數(shù)據(jù)顯示在瀏覽器頁面的速度,每個查詢測10次,取平均值,結(jié)果如下表1所示:

由結(jié)果可知,數(shù)據(jù)量越大、Skip在總數(shù)據(jù)量中占的百分比越大,算法改進(jìn)前后的速度差異越明顯,效果越好。細(xì)粒度查詢模式分類方法的確取得了較好的性能。

3Where-Limit優(yōu)化算法

3.1設(shè)計原理

Where-Limit算法核心不是計算數(shù)據(jù)偏移量,而是傳上一頁的數(shù)據(jù)標(biāo)記或關(guān)鍵詞,根據(jù)where條件來查詢實現(xiàn)分頁,這種模式必須有一個連續(xù)的索引,才能通過直接指定位置,查找到要顯示頁的起始數(shù)據(jù)標(biāo)記。方法是在程序啟動時將所有數(shù)據(jù)關(guān)鍵詞讀取到數(shù)組中,需要分頁的時候通過頁碼記錄和數(shù)組下標(biāo)的對應(yīng)關(guān)系去查詢頁碼首記錄的數(shù)據(jù)標(biāo)記,這樣分頁算法也體現(xiàn)了以空間換時間的思想。如果數(shù)據(jù)本身沒有主鍵的,可以用MongoDB自帶的ObjectId來查,由于基于索引,速度很快。算法原理圖如下圖2所示。

下面的代碼給出了顯示數(shù)據(jù)的后臺核心代碼:

3.2實驗分析

為驗證Where-limit算法的效果,本文同樣以Web日志系統(tǒng)為例,在結(jié)果集記錄數(shù)在10萬,30萬,50萬的情況下查詢最后一頁的效率,測試算法優(yōu)化前后的頁面數(shù)據(jù)顯示在瀏覽器頁面的速度,每個查詢測10次,取平均值,結(jié)果如下表2所示:

由結(jié)果可知,Where-limit方案由于每次只返回特定頁面的數(shù)據(jù),網(wǎng)絡(luò)數(shù)據(jù)傳輸小,同時不再使用Skip函數(shù),不僅比內(nèi)置skip-limit,同樣與細(xì)粒度查詢改進(jìn)算法比較,分頁速度快且穩(wěn)定可靠。唯一的缺點(diǎn)是關(guān)鍵詞數(shù)組的大小會對服務(wù)器內(nèi)存要求較高,但可以使用分割數(shù)組的方法解決。

4其它分頁因素優(yōu)化

為提高Web2.0數(shù)據(jù)分頁響應(yīng)速度,就要盡量節(jié)約帶寬和提高查詢速度。節(jié)約帶寬,即不需要傳輸?shù)臄?shù)據(jù)就不要傳輸,已經(jīng)查詢的數(shù)據(jù)可以使用Ajax局部刷新技術(shù),減少傳輸?shù)臄?shù)據(jù),相當(dāng)于節(jié)約了帶寬。

查詢速度提高,即在查詢數(shù)據(jù)庫時,不需要的字段和記錄不返回,只回傳需要的數(shù)據(jù),因為Web頁面主要操作都是與數(shù)據(jù)庫打交道,數(shù)據(jù)庫查詢速度幾乎是一個網(wǎng)站設(shè)計好壞的標(biāo)準(zhǔn)。MongoDB基于其提供的類似于關(guān)系數(shù)據(jù)庫的索引機(jī)制實現(xiàn)復(fù)雜查詢,數(shù)據(jù)查詢的速度很大程度上取決于索引的使用。根據(jù)查詢創(chuàng)建索引,必要時創(chuàng)建復(fù)合索引,MongoDB的查詢優(yōu)化方式簡單直接,在選定了索引之后可以很好地提升性能,但在重復(fù)選擇索引時會造成一定的開銷,導(dǎo)致查詢速度變慢。所以若某些應(yīng)用場景下查詢固定地使用一個索引可以達(dá)到最好的性能,程序中可以使用MongoDB提供的hint函數(shù)指定索引,避免數(shù)據(jù)庫無謂的嘗試。同時,使用優(yōu)化方法使Mongodb數(shù)據(jù)庫負(fù)載均勻,也可達(dá)到并發(fā)訪問時優(yōu)化服務(wù)的目的。

5結(jié)論

通過實驗,可以看出,以上各種技術(shù)各有優(yōu)缺點(diǎn)和適用場合。使用skip和limit適用于數(shù)據(jù)量比較少的數(shù)據(jù)分頁,但隨著數(shù)據(jù)偏移量變大,分頁效率會大大降低。使用細(xì)粒度查詢改進(jìn)算法在一定程度上可以改進(jìn)大數(shù)據(jù)情況下排序靠后的數(shù)據(jù)頁的數(shù)據(jù)獲取速度,但對獲取結(jié)果集中間數(shù)據(jù)性能提高不大。Where-limit算法較細(xì)粒度查詢改進(jìn)算法通用性更好,其使用數(shù)組存取跳轉(zhuǎn)頁開始的關(guān)鍵詞數(shù)據(jù),使用條件和limit進(jìn)行精確定位,無在結(jié)果中進(jìn)行記錄遍歷情況,效率大大提高,但關(guān)鍵值數(shù)組在記錄較大時對內(nèi)存容量要求高,可以使用分割數(shù)組來進(jìn)行優(yōu)化,其次,對于大數(shù)據(jù)下的分頁,各種方法必須建立索引,所以對增加和修改記錄多的應(yīng)用會造成一定性能影響。

龙泉市| 拜泉县| 灌云县| 公主岭市| 高雄县| 嵩明县| 绍兴县| 日土县| 锡林郭勒盟| 宜宾市| 布尔津县| 乐清市| 封丘县| 凌云县| 韩城市| 淳化县| 新疆| 哈尔滨市| 安宁市| 沙湾县| 南开区| 焉耆| 永兴县| 焦作市| 分宜县| 涞源县| 千阳县| 高州市| 霍邱县| 育儿| 保康县| 德惠市| 揭东县| 方山县| 彭州市| 新泰市| 修文县| 汶上县| 延吉市| 咸丰县| 罗田县|