2011-03-08 13 views
5

node.js ve mongodb kullanarak yeni bir proje başlattım ve yaklaşık 2 gün sonra MongoDB'de yaklaşık 600 bin nesne topladım. Performans üzerinde çok büyük (olumsuz) bir etki farkettim ve eğer bir başka DB'ye olabildiğince geçmem gerekirse veya Mongo'yla devam edip bazı (daha fazla) optimizasyon yapsam endişelenmeye başlıyorum. BöyleMongoDB, 600k nesnelere alternatif DB uygular mı? optimizasyonlar?

Temelde ben depolamak ediyorum koordinatları:

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

değil daha ... ve benim sorguları şuna benzer: Ben her biri için endeksini ayarlama denedim

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

alanları: x1, y1, y1, y1 yanı sıra: {x1:1,y1:1},{x2:1,y2:1}. Ayrıca, yalnızca gerekli olan alanları da getirdim ... ama yine de, ~ 40k satırlık bir sonuç kümesiyle bir sorgulama yapmak, 2-8 sn'lik bir çalışma zamanında sona eriyor. Btw: PHP'de aynı sorguyu gerçekleştirirken Bellek Dışı Mesajıyla (256MB RAM) öldü.) Gerçekten fikirlerin tükeniyor

;

makine, bu rafa en tozlu bir tane değil 8 GB RAM ile 2.67GHz @ bir Intel (R) Core (TM) i7 CPU 920 olduğunu ve önümüzdeki haftalar için milyonlarca ve milyonlarca satırın geldiğini görüyorum. Muhtemelen fark ettiğiniz gibi sıralar nispeten küçüktür. Bölümleme ile MySQL daha iyi performans gösterir mi? Başka bir NoSQL DB?

Ve "2-8secs yavaş değil" hakkında trolling lütfen - bu zaten bir sorun haline geliyor. Birkaç önbelleğe alınmış istek aynı anda makineye çarptığında, yük 4'e ve 10'dan az kullanıcıya erişir.

+4

Hangi dizinlerde kurulum var? Sorgunuzu kabukta çalıştırmayı deneyin ve sonunda sorgu planını ve hangi dizinlerin vurulduğunu göstermesi için .explain() öğesini ekleyin. –

+3

Bu sorgu ile neyi başarmaya çalıştığınızdan emin değilim ama jeo-uzamsal indeksleri kullanarak daha iyi şansınız olabilir. http://www.mongodb.org/display/DOCS/Geospatial+Indexing –

+0

Bu koordinatların göründüğü gibi dikdörtgenlerin köşeleri olduğunu varsayalım, MongoDB'nin jeo-uzamsal dizinlerini kullanmalısınız: http://www.mongodb.org/ display/DOCS/Geospatial + Indexing –

cevap

9

Sorunumu düşünmek için zaman ayıran herkese teşekkürler. Geospatial Indexes kullanmanın önerileri, aradığım cevap gibi görünüyor. İndekslerin mongodb için daha etkili olmasının yanı sıra, tüm kutuların sorgulanma şekli basitçe sallanıyor!

Bazı gerçekleri belirtmek için: Kod ve koleksiyon verilerimi yeniden yazmaya başladım ve basit bir karşılaştırma ile başladım. Benim veriler önce böyle görünüyordu:


[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 
) 

gösteriyordu:


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

endeksi::


{coords:'2D'} 

ben karşılaştırıldığında


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

Şimdi verilerim şöyle

iki komut dosyası. Birincisi eski koleksiyonundan 400x400 piksel kutu sorgular ve aldı:

 


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


İkinci senaryo aynı kutuya için dizini ve sorgular kullanır ama coğrafi dizini kullanarak:

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

bir var büyük fark ve koleksiyonlarımda sadece 3200 obje var (her biri). Canlı veri tabanım/koleksiyonum halihazırda yaklaşık 2 milyon nesne içeriyor (çevrimiçi olarak 12 gün sonra). Bu komut dosyaları ile canlı verileri karşılaştırmak için sabırsızlanıyorum. Bana çok umut verici görünüyor! :)

Teşekkür ederim, Stackoverflow kayalar!)

+2

+1 Mükemmel takip. – Greg

0

Performansı artırmanın hızlı ve kirli bir yolu (bellek/alan kurbanı) index "x1", "x2", "y1" ve "y2" olacaktır, ancak belki de geospatial indexes'u kullanmalısınız.

İlgili konular