2016-11-21 9 views
1

私はかなり長い実行時間を見ているクエリを持っています。クエリ:IXSCANのパフォーマンスを改善しますか?

db.legs.find(
    { 
    effectiveDate: {$lte: startDate}, 
    discontinuedDate: {$gte: startDate} 
    } 
).count() 

と以下の私のログに出力されます。

2016-11-21T08:58:50.470-0800 I COMMAND [conn2] command myDB.legs 
command: count { count: "legs", query: { effectiveDate: { $lte: new Date(1412121600000) }, discontinuedDate: { $gte: new Date(1412121600000) } }, fields: {} } 
planSummary: IXSCAN { discontinuedDate: 1 } keyUpdates:0 writeConflicts:0 numYields:82575 reslen:47 locks:{ Global: { acquireCount: { r: 165152 } }, MMAPV1Journal: { acquireCount: { r: 82576 } }, Database: { acquireCount: { r: 82576 } }, Collection: { acquireCount: { R: 82576 } } } protocol:op_command 13940ms 

私は{effectiveDate: 1, discontinuedDate: 1}のインデックスを持っており、データを取得するためにIXSCANを使用しています。私は誰もこのクエリをスピードアップする方法を提案できるかどうか疑問に思っていますか? IXSCANはこの状況で私たちが期待できる最速の操作ではありませんか?

+0

「説明する」とは何ですか? 'db.legs.explain(1).find({effectiveDate:{$ lte:...残りのクエリ}'? –

+0

@AlexBlexかなり長いですが、ここで見ることができます: http://pastebin.com/ wknw8AMm –

+0

あなたのindecesは何ですか? – hyades

答えて

1

多数の利回りとロックが同時に発生する要求の数が多いことを示し、クエリの実行を中断します。 WireTigerエンジンにはコレクションロックに加えてドキュメントロックがありますので、試してみる価値はあります。

explainの出力は、クエリの日付が "1/1/2015"のような文字列と比較され、一致が0になるため、あまり役に立ちません。

今、IXSCANについて。 2つの範囲フィルタがあるため、インデックス交差点が機能しないため、基本的に1つのインデックスを使用してドキュメントをフェッチし、2番目のフィルタを適用します。それはまだ覆われたクエリのために働くかもしれないが、全くのインデックスのないクエリを試すために良いアイデアかもしれません:それはCOLLSCANをしたとしてもカントー

db.legs.find({ 
    effectiveDate: {$lte: startDate}, 
    discontinuedDate: {$gte: startDate} 
}) 
.hint({$natural:true}) 
.count() 

を、それが迅速かもしれ代わりにFETCHのCOUNT段階を、使用しています。

0

新しいフィールドに日付msを格納し、同じフィールドにフィルタを適用します。入力された入力日付もmsに変換され、フィルタが適用されます。これはより速く行う必要があります。日時をmsに変換するためのリンクepochconverter

関連する問題