2011-08-10 11 views
6

Şu tasarımı verdiğimi varsayalım:MongoDB - Düz anahtarlarda arama yapmak kadar hızlı dizilerde mi arama yapıyor?

Şimdi şu şekilde sorguladım:

db.events.find({ 
    participant_ids: ObjectId(...) 
}); 

Bunun aynısı:

db.events.find({ 
    participant_ids: { 
     $in: ObjectId(...) 
    } 
}); 

Bu ikisi arasında performans farkı (ama yanılıyorsam düzeltin!).


Her etkinlik için en az 1 ve en çok 2 katılımcı vardır. Bu yüzden şu tasarımı kullanabilirim:

id | participant_1_id | participant_2_id 

...

db.events.find({ 
    $or: { 
     participant_1_id: ObjectId(...), 
     participant_2_id: ObjectId(...) 
    } 
}); 

Endeksleme kullanmazsam, bu muhtemelen olmaz. Gerçekten bir fark yaratıyorsun, ama tabii ki ben.

İlk tasarım için aşağıdaki dizini kullanacağım:

db.events.ensureIndex({ 
    participant_ids: 1 
}); 

İkincisi için şunu yapacağım:

db.events.ensureIndex({ 
    participant_1_id: 1, 
    participant_2_id: 1 
}); 

Her ikisi de downsides performanslarına baktığınızda.

  • 1. sorgu: Bir Array kullanılması, düz bir tuş kullanmanın muhtemelen daha yavaştır.
  • 2. sorgu:$or -operator kullanımı çok hızlı değil.
  • Çok ölçeklenebilir değil, diyebilirim ki katılımcılar sınırını bir süre serbest bırakmak istiyorum, bu mümkün olmayacaktı ($or - limitsiz anahtarlar ve sınırsız öğeleriniz var) sorguları).

Sorularım şunlardır: - Hangi tasarımı kullanmalıyım? - Array s'yi indeksleyebilir miyim? Dokümanlar bu konuda bir şey söylemiyorlar ve emin değilim ki Array'ler (içeriği çok fazla değişebildiğinden).

cevap

5

1. sorgu: Bir Dizinin kullanılması, düz bir anahtar kullanmaktan daha yavaştır.

Sanmıyorum. Bir değeriniz ("düz anahtar") veya çoklu ("Array") varsa, aynı dizin tabanlı erişim yolu olmalıdır.

participant_1_id, participant_2_id sadece korkunç bir yöntemdir.

+0

Çok teşekkür ederim! Korkarım ki daha yavaş olurdu (diğer rdb'ler Array'ı kullanmayan bir sebep olabilir). Sadece, ayrı tuşlar kadar hızlı olduğunu duymak harika (sadece daha okunaklı). – elslooo

+1

Onaylandı. Performans farkı yok ve dizi versiyonu biraz daha esnektir. –

İlgili konular