日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 數(shù)據(jù)庫 > 數(shù)據(jù)庫應(yīng)用 > 大偏移量下Redis、MongoDB分頁/排名性能比較

大偏移量下Redis、MongoDB分頁/排名性能比較

來源:程序員人生   發(fā)布時(shí)間:2014-12-19 08:32:37 閱讀次數(shù):3544次

題目其實(shí)其實(shí)不太準(zhǔn)確,由于數(shù)據(jù)庫其實(shí)不會(huì)提供分頁、排名等功能,提供的只是數(shù)據(jù)的存取,分頁排名這些都是我們基于數(shù)據(jù)庫的實(shí)用案例而已。但是不管是Redis還是MongoDB,通常都有1些常規(guī)的做分頁和排名的方法。本文就通過1些測(cè)試數(shù)據(jù)來向大家介紹Redis和MongoDB(和傳統(tǒng)關(guān)系型數(shù)據(jù)庫)在這方面的性能差別。

分頁

首先我們來做1個(gè)分頁,在MongoDB中示例數(shù)據(jù)以下所未:

db.scores.find(); {lid: ObjectId("4fe506dabb2bfa742d000001"), score: 1, name: 'user_1'} {lid: ObjectId("4fe506dabb2bfa742d000001"), score: 2, name: 'user_2'} {lid: ObjectId("4fe506dabb2bfa742d000001"), score: 3, name: 'user_3'} {lid: ObjectId("4fe506dabb2bfa742d000001"), score: 4, name: 'user_4'}

其中l(wèi)id字段用于辨別不同的緯度,主要用在挑選上,在測(cè)試collection中,1共有5個(gè)不同的lid值,每個(gè)對(duì)應(yīng)1,200,000條數(shù)據(jù),1共6,000,000條數(shù)據(jù)。索引在lid 和 score上。(下面的查詢能使用到索引)

然后我們進(jìn)行下面的性能測(cè)試:

collection = Mongo::Connection.new.db('test').collection('scores') Benchmark.bmbm do |x|   x.report("mongo small") do     100.times do |i|       collection.find({:lid => lids.sample}, {:fields => {:_id => false, :score => true, :user => true}}).sort({:score => ⑴}).limit(20).skip(i * 20).to_a     end   end   x.report("mongo medium") do     100.times do |i|       collection.find({:lid => lids.sample}, {:fields => {:_id => false, :score => true, :user => true}}).sort({:score => ⑴}).limit(20).skip(i * 1000).to_a     end   end   x.report("mongo large") do     100.times do |i|       collection.find({:lid => lids.sample}, {:fields => {:_id => false, :score => true, :user => true}}).sort({:score => ⑴}).limit(20).skip(i * 10000).to_a     end   end end

上面分別對(duì)skip條數(shù)比較小,中等大小和非常大3種情況進(jìn)行了測(cè)試。而limit指定獲得的數(shù)據(jù)都1樣是20條。這3種情況下的測(cè)試結(jié)果分別是:0.6 秒, 17 秒,173 秒。

我們可以看到,對(duì)MongoDB來講,skip的大小嚴(yán)重影響性能,應(yīng)當(dāng)嚴(yán)格避免特別大的skip操作。

下面我們將類似的數(shù)據(jù)用Redis的Sorted Sets進(jìn)行存儲(chǔ)。并進(jìn)行相應(yīng)的性能測(cè)試

redis = Redis.new(:driver => :hiredis) Benchmark.bmbm do |x|   x.report("redis small") do     100.times do |i|       start = i * 20       redis.zrevrange(lids.sample, start, start + 20, :with_scores => true)     end   end   x.report("redis medium") do     100.times do |i|       start = i * 1000       redis.zrevrange(lids.sample, start, start + 20, :with_scores => true)     end   end   x.report("redis large") do     100.times do |i|       start = i * 10000       redis.zrevrange(lids.sample, start, start + 20, :with_scores => true)     end   end

這里skip的值和上面MongoDB中是1樣的,那末Redis的表現(xiàn)如何呢。這3種情況下的測(cè)試結(jié)果分別是:0.028 秒, 0.025 秒, 0.028 秒。

采取類似于MongoDB的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)在PostgreSQL中并進(jìn)行相同的測(cè)試,其結(jié)果比MongoDB還要差1點(diǎn)。具體結(jié)果以下:

mongo small   0.6
mongo medium   17
mongo large   173
redis small   0.028
redis medium   0.025
redis large   0.028
pg small   1
pg medium   122
pg large   650

排名

排名功能與分頁功能類似,不同的是排名是通過計(jì)算大于某個(gè)值的條數(shù)來做的。

比如:

//sql select count(*) from scores where lid = $1 and score > $2 //mongo db.scores.find({lid: lid, score: {$gt: score}}).count()

由于排名和分頁實(shí)現(xiàn)原理上類似,所以結(jié)果實(shí)際上差不多。測(cè)試結(jié)果以下:

mongo top rank   1.155847
mongo average    22.291007

redis top rank   0.169442
redis average    0.162205

pg top rank      0.714144
pg average       21.771570

結(jié)論

上面做了對(duì)照,那末本文要說1個(gè)甚么問題呢?

首先,在MongoDB中,盡可能避免進(jìn)行比較大的skip操作,比如在分頁中,如果你能知道需要獲得數(shù)據(jù)的上1條score是多少,那末可能能夠用下面的方法來獲得你要的數(shù)據(jù),而不是通過1次很大的skip操作。

  db.scores.find({lid: lid, score: {$lt: last_score}}).sort({score: ⑴}).limit(20)

另外,如果你需要進(jìn)行比較大的skip操作或count比較大的數(shù)量,那末可以斟酌采取Redis的Sorted Sets來做。

后記

本文在微博上引發(fā)了1些技術(shù)朋友的討論,對(duì)對(duì)照的問題這里做1個(gè)說明。

我 們知道,Redis是內(nèi)存數(shù)據(jù)庫,而MongoDB不是,所以有朋友質(zhì)疑這里的對(duì)照是不是只是內(nèi)存與磁盤的對(duì)照。實(shí)際上這1說法不無道理,上面的測(cè)試數(shù)據(jù)出 自原作者文章,其文章也并未提及MongoDB是不是都在內(nèi)存中。根據(jù)我個(gè)人的實(shí)驗(yàn)結(jié)果,當(dāng)數(shù)據(jù)全部能夠在內(nèi)存中時(shí),確切不會(huì)出現(xiàn)如本文中所說的 MongoDB性能嚴(yán)重差異。但是,隨著skip的變大,操作時(shí)間還是在顯著變長,而Redis的Sorted Sets則相對(duì)穩(wěn)定。

同時(shí)也歡迎更多實(shí)驗(yàn)對(duì)照數(shù)據(jù)和原理分析的討論。感謝大家。


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日韩在线观看视频免费 | 这里只有精品在线 | 少妇做爰xxxⅹ性视频 | 国产精品中文字幕在线 | 成人免费视频观看 | 一二三四区在线观看 | 国产精品一区久久 | 亚洲日韩中文字幕一区 | 91精品国产91久久久久久吃药 | 日韩国产一区 | 欧美成人三区 | 亚洲国产成人精品女人 | 日本在线精品视频 | 波多野在线视频 | 亚洲性色av | 免费在线观看av网站 | 亚洲欧美激情精品一区二区 | 日韩久久久久久久久久久久 | 好看的黄色网址 | 国产精品一区二区女厕厕 | 男人操女人免费网站 | 国产成人综合亚洲 | 成人国产精品入口免费视频 | 欧美成人午夜免费视在线看片 | 自拍偷拍亚洲欧美 | 久久久久99精品国产片 | 淫片网站 | 黄色激情视频在线观看 | 欧美日韩二区三区 | 国产 欧美 日韩 一区 | 亚洲精品乱码久久久久久蜜桃 | 久久久久久久久久久国产 | 污视频网站在线观看 | 激情五月婷婷 | 男操女视频网站 | 国产精品久久久久久久久久久久冷 | 精品黄网| 国产香蕉精品 | 美女网站视频黄 | 色女网 | 国产精品免费网站 |