2011-03-08 46 views
5

我已經使用node.js和mongodb開始了一個新項目,在差不多2天后,我在MongoDB中收集了大約600k個對象。我已經注意到了對性能的巨大(負面)影響,我開始擔心是否應該儘快遷移到其他數據庫,或者如果我應該堅持使用Mongo並做一些(更多)優化。MongoDB在600k對象,替代數據庫上執行不良?優化?

基本上我存儲的座標如下:

[x1] => 687 
[y1] => 167 
[x2] => 686 
[y2] => 167 
[c] => 0 
[s] => 0 
[m] => 1299430700312 
[_id] => MongoId Object (
    [$id] => 4d73bd2c82bb5926780001ec 
) 

不多......而我的疑問是這樣的:

{'$or': [ { x1: {'$gte' : 0, '$lt' : 1000 }, y1: {'$gte' : 0, '$lt' : 1000 } , { x2: {'$gte' : 0, '$lt' : 1000 }, y2: {'$gte' : 0, '$lt' : 1000 } } ] } 

我試過設置索引爲每個字段:x1,y1,y1,y1以及:{x1:1,y1:1},{x2:1,y2:1}。 此外,我也只提取了我需要的所需字段......但仍然執行帶有〜40k行結果集的查詢,最終運行時間爲2-8secs。 順便說一句:在PHP中執行相同的查詢與內存不足消息(256MB RAM)一起死亡。

該機是英特爾(R)酷睿(TM)i7處理器920 @ 8GB的RAM 2.67GHz,它不是最塵封在一個機架;)

我真的運行的想法我在接下來的幾周看到數以百萬計的行。你可能注意到這些行相對較小。 分區的MySQL會更好嗎?任何其他NoSQL DB?

而且請大家關注「2-8秒不慢」 - 這已經成爲一個問題。當兩個未緩存的請求同時觸及機器時,負載將增加到4個,並且訪問它的用戶不到10個。

+4

你有什麼指數設置?嘗試在shell中運行查詢並在最後附加.explain(),它應該向您顯示查詢計劃以及正在查找的索引。 – 2011-03-08 01:02:33

+3

我不完全確定你想用這個查詢來完成什麼,但是使用地理空間索引可能會有更好的運氣。 http://www.mongodb.org/display/DOCS/Geospatial+Indexing – 2011-03-08 01:20:35

+0

假設這些座標看起來像是矩形的角落,那麼您應該使用MongoDB的地理空間索引:http://www.mongodb.org/顯示/ DOCS /地理空間+索引 – 2011-03-08 01:20:59

回答

9

感謝大家花時間思考我的問題。使用地理空間索引的建議似乎是我正在尋找的答案。 除了這個事實,指標是更有效的mongodb查詢整個盒子的方式只是石頭!

給出一些事實: 我剛剛開始重寫我的代碼和集合數據,並開始進行簡單比較。我的數據看之前是這樣的:


[x1] => 190 
[y1] => 18 
[x2] => 192 
[y2] => 18 
[c] => 0 
[s] => 0 
[b] => Array (
    [0] => 0 
    [1] => 0 
) 
[m] => 1299365242802 
[r] => 32596 
[_id] => MongoId Object (
    [$id] => 4d72bd7af0528ea82f000003 
) 

的指標爲:


{x1:1,y1:1}, {x2:1,y2:1} 

現在我的數據是這樣的:


[_id] => MongoId Object (
    [$id] => 4d825799b15953b90d000000 
) 
[coords] => Array (
    [x] => 190 
    [y] => 18 
) 
[x2] => 192 
[y2] => 18 
[s] => 0 
[c] => 0 
[m] => 1299365242802 
[r] => 32596 

指數:


{coords:'2D'} 

我對比兩個腳本。 第一個從舊收集查詢的400x400像素一個盒子裏了:

 


real 0m0.375s 
user 0m0.348s 
sys  0m0.021s 


第二腳本使用了相同的方塊索引和查詢,但使用的地理空間索引:

 
real 0m0.107s 
user 0m0.096s 
sys  0m0.012s 

這是一個巨大的差異,我只有約3200對象在我的收藏(每個)。我的實時數據庫/集合現在已經包含了近200萬個對象(在線12天后)。我迫不及待地想用這些腳本對實時數據進行基準測試。它對我來說看起來很有希望! :)

謝謝大家,Stackoverflow的岩石! )

+2

+1非常好的跟進。 – Greg 2011-03-17 19:30:31

0

提高性能(犧牲內存/空間)的一種快速和骯髒的方法是使用index「x1」,「x2」,「y1」和「y2」,但也許應該使用geospatial indexes