• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      MongoDB分頁技術(shù)優(yōu)化研究

      2018-06-20 07:46:12戴傳飛馬明棟
      關(guān)鍵詞:數(shù)組文檔數(shù)據(jù)庫

      戴傳飛,馬明棟

      (1.南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210003;2.南京郵電大學(xué) 地理與生物信息學(xué)院,江蘇 南京 210023)

      0 引 言

      大數(shù)據(jù)時(shí)代,越來越多不同內(nèi)容和形式的數(shù)據(jù)涌現(xiàn)出來,半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)的使用使當(dāng)前系統(tǒng)應(yīng)用越來越豐富多彩。面對海量數(shù)據(jù)的存儲(chǔ),原始的關(guān)系型數(shù)據(jù)庫已經(jīng)顯得力不從心[1]。大數(shù)據(jù)的出現(xiàn)以及云計(jì)算的盛行使NoSQL這種非結(jié)構(gòu)化數(shù)據(jù)庫越來越受到重視[2]。盡管數(shù)據(jù)庫技術(shù)發(fā)生了巨大變革,但是查詢操作仍然是最頻繁的數(shù)據(jù)庫操作,因此研究數(shù)據(jù)庫的查詢及其優(yōu)化變得十分重要。作為NoSQL之一的MongoDB,因其在處理高并發(fā)、大數(shù)據(jù)等領(lǐng)域的優(yōu)勢而備受青睞[3]。文中將主要關(guān)注MongoDB的查詢優(yōu)化,針對skip_limit分頁查詢技術(shù)的不足提出一種新的分頁查詢算法[4]。

      1 MongoDB簡介

      MongoDB是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

      MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值對組成,字段值可以包含其他文檔,數(shù)組及文檔數(shù)組[5]。MongoDB文檔類似于JSON對象的BSON。BSON是為效率而設(shè)計(jì)的,只需要使用很少的空間,同時(shí)其編碼和解碼都是非??焖俚摹<词乖谧顗牡那闆r下,BSON格式也比JSON格式在最好的情況下存儲(chǔ)效率高。

      MongoDB的主要功能特性如下:

      (1)面向集合存儲(chǔ),容易存儲(chǔ)對象類型的數(shù)據(jù)。在MongoDB中數(shù)據(jù)被分組存儲(chǔ)在集合中,集合類似RDBMS中的表,并且一個(gè)集合中可以存儲(chǔ)無限多的文檔[4]。

      (2)模式自由,采用無模式結(jié)構(gòu)存儲(chǔ)。

      (3)支持完全索引,可以在任意屬性上建立索引,包含內(nèi)部對象。MongoDB的索引和RDBMS的索引基本一樣,可以在指定屬性、內(nèi)部對象上創(chuàng)建索引以提高查詢速度[6]。

      (4)強(qiáng)大的聚合工具。MongoDB除了提供豐富的查詢功能外,還提供強(qiáng)大的聚合工具,如count、group等,同時(shí)支持使用MapReduce完成復(fù)雜的聚合任務(wù)[7]。

      (5)支持復(fù)制和數(shù)據(jù)恢復(fù)。MongoDB支持主從復(fù)制機(jī)制,可以實(shí)現(xiàn)數(shù)據(jù)備份、故障恢復(fù)、讀擴(kuò)展等功能。

      (6)使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對象(如視頻)[8]。使用二進(jìn)制格式存儲(chǔ),可以保存任何類型的數(shù)據(jù)對象。

      (7)自動(dòng)處理分片,以支持云計(jì)算層次的擴(kuò)展。MongoDB支持集群自動(dòng)切分?jǐn)?shù)據(jù),對數(shù)據(jù)進(jìn)行分片可以使集群存儲(chǔ)更多的數(shù)據(jù),實(shí)現(xiàn)更大的負(fù)載,也能保證存儲(chǔ)的負(fù)載均衡[9]。

      (8)支持Perl、PHP、Java、C#、JavaScript、Ruby、C和C++語言的驅(qū)動(dòng)程序[10],開發(fā)人員使用任何一種主流開發(fā)語言都可以輕松編程。

      2 分頁查詢技術(shù)

      隨著信息技術(shù)的高速發(fā)展,應(yīng)用系統(tǒng)中的數(shù)據(jù)量越來越龐大,高效的查詢方法顯得尤為重要。一般來講,不要將查詢獲得的數(shù)據(jù)一次性全部顯示出來,因?yàn)檫@樣會(huì)耗費(fèi)大量的查詢時(shí)間[11]。當(dāng)面對海量數(shù)據(jù)時(shí),將大量數(shù)據(jù)直接顯示出來會(huì)給用戶瀏覽帶來極大的不便,對系統(tǒng)性能也會(huì)造成嚴(yán)重的影響。再者,一次性將大量的數(shù)據(jù)發(fā)往客戶端,會(huì)增加網(wǎng)絡(luò)帶寬的負(fù)擔(dān),延緩系統(tǒng)的反應(yīng)速度,降低系統(tǒng)的性能。面對這些問題,采取分頁方式來顯示數(shù)據(jù)就變得很重要。在數(shù)據(jù)庫查詢中對數(shù)據(jù)進(jìn)行分頁顯示是十分必要的。

      與關(guān)系型數(shù)據(jù)庫中的分頁方法類似,MongoDB數(shù)據(jù)庫也可以使用skip_limit方法進(jìn)行數(shù)據(jù)庫分頁。針對小型用戶系統(tǒng),使用skip_limit分頁方法確實(shí)可以迅速地查詢出指定數(shù)據(jù),并且不會(huì)對分頁響應(yīng)速度產(chǎn)生太大影響。但是,如果系統(tǒng)中存儲(chǔ)的數(shù)據(jù)量變得非常龐大,skip操作就會(huì)隨之變得非常慢,從而嚴(yán)重影響數(shù)據(jù)庫查詢效率。引發(fā)這種狀況的主要原因是:skip操作需要先找到被略過的數(shù)據(jù),然后再將這些數(shù)據(jù)進(jìn)行拋棄。目前很多數(shù)據(jù)庫都會(huì)將大量的元數(shù)據(jù)保存在索引當(dāng)中,其目的是為了減輕skip函數(shù)的工作量。雖然這種方法非常有用,但是目前的MongoDB數(shù)據(jù)庫并不支持這一操作,因此有必要使用新的分頁方法來處理海量數(shù)據(jù)查詢。

      在當(dāng)前Web應(yīng)用開發(fā)中,數(shù)據(jù)庫分頁技術(shù)是經(jīng)常使用的一種數(shù)據(jù)表示方法,數(shù)據(jù)分頁效率的好壞極大地影響了系統(tǒng)性能,已經(jīng)被作為數(shù)據(jù)庫評判的重要指標(biāo)[12]。不僅如此,分頁顯示速度的快慢會(huì)對Web應(yīng)用的性能和網(wǎng)絡(luò)服務(wù)質(zhì)量產(chǎn)生極大的影響。

      3 skip_limit分頁方法

      3.1 原 理

      使用skip_limit方法進(jìn)行分頁查詢時(shí),首先會(huì)根據(jù)查詢條件查找出所有的結(jié)果集;然后使用skip函數(shù)跳過指定數(shù)量的數(shù)據(jù);最后通過limit函數(shù)來限制顯示記錄的數(shù)量。

      在常用的查詢語句中,經(jīng)常會(huì)使用find函數(shù)來查找指定條件的結(jié)果集,使用limit函數(shù)限制返回的結(jié)果數(shù),使用skip函數(shù)跳過指定條數(shù)的記錄。通常在數(shù)據(jù)庫查詢中使用分頁查詢時(shí)還會(huì)使用sort方法,該方法可以對查詢記錄進(jìn)行排序,這為數(shù)據(jù)分頁查詢提供了極大的便利。這三種方法可以組合使用,對于分頁非常有效。

      使用skip_limit分頁方法在test數(shù)據(jù)庫的users集合中分別查詢第1頁、第2頁、第n頁年齡為20、21、22的用戶數(shù)據(jù),有關(guān)查詢語句如下所示:

      第1頁:

      db.users.find({“age”:{“$in”:[20,21,22]}}).skip(0).limit(10)

      第2頁:

      db.users.find({“age”:{“$in”:[20,21,22]}}).skip(10).limit(10)

      第n頁:

      db.users.find({“age”:{“$in”:[20,21,22]}}).skip((n-1)*10).limit(10)

      通用公式可以表示為:

      db.集合名稱.find(查詢條件).skip((頁碼-1)*每頁記錄數(shù)).limit(每頁記錄數(shù))

      上述公式首先使用find函數(shù)查詢當(dāng)前數(shù)據(jù)庫中指定條件的集合數(shù)據(jù),即查找出users集合中的所有數(shù)據(jù)(注意find方法中可包含查詢條件);然后使用skip方法略過指定的文檔數(shù),即略去當(dāng)前頁之前的所有數(shù)據(jù);最后使用limit方法來限制每頁需要顯示多少條記錄,該實(shí)驗(yàn)為10條。一般在進(jìn)行分頁查詢時(shí)還會(huì)使用sort對結(jié)果集進(jìn)行排序。

      3.2 不 足

      MongoDB數(shù)據(jù)庫采用內(nèi)置的skip+limit分頁方法,對于處理少量的數(shù)據(jù),這種分頁的確能起到不錯(cuò)的效果,查詢速度也能得以提升[13]。但是,當(dāng)存儲(chǔ)的數(shù)據(jù)量達(dá)到百萬級別甚至更大時(shí),內(nèi)置的分頁方法就變得難以處理,它會(huì)導(dǎo)致頁面數(shù)據(jù)獲取速度變得極其緩慢,系統(tǒng)性能因而受到極大的影響[14]。造成該結(jié)果的原因是如果查詢的數(shù)據(jù)位于排序的集合后面,此時(shí)使用skip函數(shù)就需要跳過很大的數(shù)據(jù)量,在這種情況下仍使用skip函數(shù)就會(huì)極大地影響數(shù)據(jù)查詢效率。也就是說在大數(shù)據(jù)下,skip_limit的分頁查詢已經(jīng)不再適用。

      4 where_limit分頁方法

      面對海量數(shù)據(jù)查詢,針對skip_limit方法存在的問題,為提升數(shù)據(jù)庫的查詢效率,文中提出了一種新的分頁方法—where_limit。與skip_limit方法的原理不同,where_limit算法不再以數(shù)據(jù)偏移量為核心,它通過尋找出分頁信息中當(dāng)前所在頁的上一頁的數(shù)據(jù)標(biāo)記或關(guān)鍵詞,然后以該關(guān)鍵詞為基礎(chǔ)進(jìn)行條件查詢,只需使查詢語句中的條件參數(shù)大于這個(gè)關(guān)鍵詞,就能決定最后到底需要limit到多少條數(shù)據(jù),從而實(shí)現(xiàn)分頁查詢??紤]到關(guān)鍵詞數(shù)組的連續(xù)性,需要在MongoDB數(shù)據(jù)庫中創(chuàng)建一個(gè)連續(xù)的索引,因?yàn)橹挥性谶B續(xù)索引中,才能成功找到指定的關(guān)鍵詞。

      4.1 核心思想

      利用where_limit分頁方法進(jìn)行數(shù)據(jù)查詢時(shí),首先通過查詢條件來獲取文檔中所有數(shù)據(jù)的關(guān)鍵詞,然后將其讀取到相應(yīng)數(shù)組中,然后根據(jù)關(guān)鍵詞數(shù)組的下標(biāo)來確定需要跳過的記錄數(shù),接著使用limit方法來限定顯示的記錄數(shù)目,最后使用sort方法對結(jié)果排序。這種分頁算法的核心思想便是犧牲空間來提高查詢效率。雖然需要用比較大的存儲(chǔ)空間去存放關(guān)鍵詞數(shù)組,但是如果能極大地提升查詢效率,這種分頁方法也是非??尚械摹?/p>

      以用戶基本信息為例來測試where_limit方法是否優(yōu)于skip_limit方法。為進(jìn)行數(shù)據(jù)分頁查詢,需要先在用戶信息系統(tǒng)中實(shí)現(xiàn)where_limit方法,可以將其分為三步:

      (1)使用count函數(shù)確定數(shù)據(jù)庫中總的記錄數(shù)的長度,然后根據(jù)每頁需要顯示的記錄數(shù)來計(jì)算出數(shù)據(jù)需要顯示的總頁數(shù);

      (2)根據(jù)查詢條件獲取關(guān)鍵詞數(shù)組;

      (3)通過關(guān)鍵詞數(shù)組中的關(guān)鍵詞進(jìn)行分頁查詢。

      where_limit方法要優(yōu)于skip_limit方法,那是因?yàn)樗苊馐褂胹kip函數(shù),系統(tǒng)不需要花費(fèi)大量時(shí)間來跳過大量數(shù)據(jù)。使用skip_limit方法進(jìn)行分頁查詢時(shí),會(huì)優(yōu)先考慮分頁的數(shù)據(jù)偏移量(skip函數(shù)的參數(shù)值),隨著偏移量不同,每頁查詢的時(shí)間就會(huì)不同:偏移量越大,查詢時(shí)間也就越長。where_limit為解決這一問題,使用了查找關(guān)鍵詞數(shù)組的方法:在查詢過程中,用戶只需要根據(jù)查詢條件尋找出關(guān)鍵詞數(shù)組,然后根據(jù)數(shù)組中關(guān)鍵詞的下標(biāo)來決定要跳過的記錄數(shù),這樣就避免使用skip函數(shù)。算法處理流程如圖1所示。

      圖1 where_limit算法處理流程

      4.2 驗(yàn)證分析

      為驗(yàn)證where_limit算法的可行性,通過MongoDB自帶的Mongo shell向數(shù)據(jù)庫名為test,集合名為users的集合中插入100萬條數(shù)據(jù)。集合中文檔結(jié)構(gòu)如下:

      {

      “_id”:ObjectId(‘584e58e46dadd1120d4f75345’),

      “name”:“Siri”,

      “age”:35,

      “sex”:“woman”,

      “num”:1

      }

      users集中存放有100萬條記錄,分頁時(shí)限制在每頁顯示100條記錄。

      使用skip_limit方法和where_limit方法分別對1 000頁和8 000頁數(shù)據(jù)進(jìn)行查詢,可得出通過where_limit方法對應(yīng)的查詢條件分別是num值為100 000、800 000,使用MongoDB性能分析工具explain()進(jìn)行分析,實(shí)驗(yàn)結(jié)果如圖2~5所示。

      圖2 使用skip_limit方法查詢第1 000頁數(shù)據(jù)

      圖3 使用where_limit方法查詢第1 000頁數(shù)據(jù)

      圖4 使用skip_limit方法查詢第8 000頁數(shù)據(jù)

      圖5 使用where_limit方法查詢第8 000頁數(shù)據(jù)

      從以上圖中可以發(fā)現(xiàn),查詢第1 000頁、8 000頁數(shù)據(jù),skip_limit方法所需時(shí)間為65 ms、402 ms,而使用where_limit方法所需時(shí)間接近0 ms、0 ms。使用where_limit方法的查詢耗時(shí)遠(yuǎn)小于使用skip_limit方法,優(yōu)化效果明顯。

      為了提高實(shí)驗(yàn)數(shù)據(jù)的可靠性,使用多臺虛擬機(jī)進(jìn)行實(shí)驗(yàn),采用取平均值的方法,對兩種分頁方法進(jìn)行對比,測試結(jié)果如圖6所示。

      圖6 兩種分頁方法效率對比

      由實(shí)驗(yàn)結(jié)果可知,skip_limit方法在skip方法跳過記錄數(shù)越大時(shí),數(shù)據(jù)查詢所耗費(fèi)的時(shí)間越長,因此查詢效率越低;而where_limit方法由于每次只返回特定頁面的數(shù)據(jù),不再使用skip函數(shù),分頁速度快且穩(wěn)定可靠,查詢效率明顯優(yōu)于skip_limit方法。

      5 結(jié)束語

      MongoDB內(nèi)置的skip操作在小數(shù)據(jù)的情況下實(shí)現(xiàn)分頁技術(shù)簡單,但是在數(shù)據(jù)量達(dá)到百萬級別甚至更大時(shí),skip操作的弊端愈加明顯。數(shù)據(jù)庫的分頁查詢效率成為影響數(shù)據(jù)庫訪問性能的重要因素。通過分析MongoDB內(nèi)置的skip_limit分頁方法的優(yōu)缺點(diǎn)及影響分頁查詢速度的關(guān)鍵因素,提出一種新的數(shù)據(jù)分頁方法—where_limit。通過改變查詢文檔的規(guī)則及使用合理的索引來提高分頁效率。實(shí)驗(yàn)結(jié)果表明,優(yōu)化后的查詢方法在實(shí)現(xiàn)分頁顯示的操作中速度有明顯的提高。

      參考文獻(xiàn):

      [1] 程顯峰.MongoDB權(quán)威指南[M].北京:人民郵電出版社,2011.

      [2] 金 鑫.非結(jié)構(gòu)化數(shù)據(jù)查詢處理與優(yōu)化[D].杭州:浙江大學(xué),2015.

      [3] HUANG Yu,LUO Tiejian.NoSQL database:a scalable,availability,high performance storage for big data[M].[s.l.]:Springer International Publishing,2014.

      [4] 潘 凡.從MySQL到MongoDB-視覺中國的NoSQL之路[J].程序員,2010(6):79-81.

      [5] STEVIC M P,MILOSAVLJEVIC B,PERISIC B R.Enhancing the management of unstructured data in e-learning systems using MongoDB[J].Program Electronic Library and Information Systems,2015,49(1):30-45.

      [6] 吳德寶.關(guān)系與非關(guān)系數(shù)據(jù)庫應(yīng)用對比研究[D].撫州:東華理工大學(xué),2015.

      [7] 梁云柯.MongoDB索引機(jī)制研究[D].重慶:重慶郵電大學(xué),2016.

      [8] 沈 姝.NoSQL數(shù)據(jù)庫技術(shù)及其應(yīng)用研究[D].南京:南京信息工程大學(xué),2012.

      [9] 祁 蘭.基于MongoDB的數(shù)據(jù)存儲(chǔ)與查詢優(yōu)化技術(shù)研究[D].南京:南京郵電大學(xué),2016.

      [10] 呂明育,李小勇.NoSQL數(shù)據(jù)庫與關(guān)系數(shù)據(jù)庫的比較分析[J].微型電腦應(yīng)用,2011,27(10):55-58.

      [11] 郭忠南,孟凡榮.關(guān)系數(shù)據(jù)庫性能優(yōu)化研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(23):4484-4486.

      [12] 丁智斌,石浩磊.關(guān)系數(shù)據(jù)庫設(shè)計(jì)與規(guī)范化[J].計(jì)算機(jī)與數(shù)字工程,2005,33(2):114-116.

      [13] BACH M,WERNER A.Standardization of NoSQL database languages[M].[s.l.]:Springer International Publishing,2014.

      [14] 王光磊.MongoDB數(shù)據(jù)庫的應(yīng)用研究和方案優(yōu)化[J].中國科技信息,2011(20):93-94.

      猜你喜歡
      數(shù)組文檔數(shù)據(jù)庫
      JAVA稀疏矩陣算法
      有人一聲不吭向你扔了個(gè)文檔
      JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
      數(shù)據(jù)庫
      基于RI碼計(jì)算的Word復(fù)制文檔鑒別
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
      尋找勾股數(shù)組的歷程
      讷河市| 黄石市| 西平县| 紫金县| 习水县| 禹城市| 双峰县| 彭州市| 阳江市| 达州市| 焉耆| 邢台市| 利辛县| 衡水市| 原平市| 磐安县| 内黄县| 收藏| 淳安县| 武汉市| 巫溪县| 安阳市| 兰坪| 双桥区| 怀仁县| 温泉县| 建宁县| 合江县| 礼泉县| 华阴市| 常熟市| 信丰县| 万全县| 托克逊县| 巴林右旗| 孟津县| 益阳市| 蕲春县| 台安县| 卓尼县| 固镇县|