2016-05-25 3 views
3

パフォーマンスmongodbを勉強しました。私は500百万の文書のコレクションを持っています。私は2つのインデックス作成:フィールド上のmongodb - 件数を改善する

db.appels.createIndex({OPERATEUR_RECEVEUR:1}); 
db.appels.createIndex({DUREE_APPEL:1}); 

数を、高速である:

15秒:

db.appels.find ({ "DUREE_APPEL" : { "$gt" : 42 } }).count(); 

2秒:

db.appels.find({OPERATEUR_RECEVEUR:"MTN"}).count(); 

しかし、2つのフィールドでカウント「and」は遅いです:

7分:

db.appels.find ({ $and : [ { "DUREE_APPEL" : { "$gt" : 42 } }, {OPERATEUR_RECEVEUR:"MTN"} ] }).count(); 

、「または」は不可能であるとの二つのフィールドを頼りに最後に

(これは、同じフィールドインデックスのない時間です):

15時間とクエリを殺します:

db.appels.find ({ $or : [ { "DUREE_APPEL" : { "$gt" : 42 } }, {OPERATEUR_RECEVEUR:"MTN"} ] }).count(); 

私は100の列を持つので、私はマルチインデックスを使用できません。私はdebian 8,2 SSD、80 Go Ram、12 Cpu、mongodb 2.4で1つのノードを使用します。どうすればスピードを上げることができますか?

+2

なぜ2つのフィールドにインデックスを作成できませんか?あなたのケースでは、DUREE_APPELとOPERATEUR_RECEVEURです。ご回答いただきありがとうございます。https://docs.mongodb.com/manual/core/index-compound/ – Saleem

+0

クエリや使用するフィールド数(時には1、場合によっては2、..、時には10)を事前に知ることはできません。 クエリは、Webインターフェイスのエンドユーザーの選択に従って動的に生成されます。 私は100の列がある場合、私は作成するために何千ものインデックスを持っています。 –

+0

さて、あなたが先験的なことを知らないなら、私はすべてのフィールドにインデックスを作成することをお勧めします。私はあなたのインデックスが余分なリソースを使いますが、データを速く返すことでユーザーエクスペリエンスが向上することを知っています。 – Saleem

答えて

0

私はそれが "カウント"が遅く、研究ではないことが分かった。同じフィールドの 応答時間が結果

"DUREE_APPEL" の数に比例する:{ "$のGT":42} - > 198 757 639レコード - > 32秒

"DUREE_APPEL" :{ "$のGT":800} - > 11 479 097記録 - > 1.9秒

"DUREE_APPEL":{ "$のGT":5000} - > 833 961記録 - > 0.14秒

インデックスだけが解決策ではない、この問題を解決する方法?

シャーディング(10ノードで5,000万行)が解決策になりますか? :https://docs.mongodb.com/manual/sharding/

ピエール