1

我注意到如果您使用 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 个单独的查询并将结果粘合在代码中?
4

0 回答 0