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