題目其實(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ù)以下所未:
其中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è)試:
上面分別對(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è)試
這里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ù)來做的。
比如:
由于排名和分頁實(shí)現(xiàn)原理上類似,所以結(jié)果實(shí)際上差不多。測(cè)試結(jié)果以下:
mongo top rank 1.155847
mongo average 22.291007redis top rank 0.169442
redis average 0.162205pg top rank 0.714144
pg average 21.771570
上面做了對(duì)照,那末本文要說1個(gè)甚么問題呢?
首先,在MongoDB中,盡可能避免進(jìn)行比較大的skip操作,比如在分頁中,如果你能知道需要獲得數(shù)據(jù)的上1條score是多少,那末可能能夠用下面的方法來獲得你要的數(shù)據(jù),而不是通過1次很大的skip操作。
另外,如果你需要進(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ù)和原理分析的討論。感謝大家。