OR 演算子と SORT 演算子を使用する場合、Mongodb 2.2 はインデックスを使用していないように見えます。このJIRAが関係しているのだろうか。
説明させてください:
db.messages.ensureIndex({ 'to_id':1, 'sent_date':-1});
db.messages.ensureIndex({ 'from_id':1, 'sent_date':-1});
メッセージ コレクションにインデックスがあります。
db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
"cursor" : "BtreeCursor to_id_1_sent_date_-1",
db.messages.find( {$or: [{'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
"cursor" : "BtreeCursor from_id_1_sent_date_-1",
クエリを実行してから、sent_date で並べ替えるには、BtreeCursor を使用します。
db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).explain()
{
"clauses" : [
{
"cursor" : "BtreeCursor to_id_1",
to_id または from_id を使用したクエリでも、BtreeCursor が使用されます。
db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
"cursor" : "BasicCursor",
不合格!to_id OR from_id AND ソートを使用したクエリは、インデックスを使用しません。なんで?
私の質問:
- それはいつもこのようなものでしたか?
- 人々はこれをどのように回避していますか - 人々は2つの別々のクエリを実行し、結果をコードで結び付けていますか?