所以,我试图查询
db.collection('collection_name').aggregate([
{
$match: { owner_id: '5be9b2f03ef77262c2bd49e6' }
},
{
$sort: { _id: -1 }
}])
上面的查询占用20秒
但如果我尝试查询
db.collection('collection_name').aggregate([{$sort : {_id : -1}}])
仅需0.7秒
为什么没有$ match的那个实际上比不匹配的要快?
更新: 当我尝试此查询
db.getCollection('callbackvirtualaccounts').aggregate([
{
$match: { owner_id: '5860457640b4fe652bd9c3eb' }
},
{
$sort: { created: -1 }
}
])
只需要0.781秒
为什么按_id排序比按创建的字段慢?
注意:我正在使用mongodb v3.0.0
答案 0 :(得分:0)
db.collection('collection_name').aggregate([
{
$match: { owner_id: '5be9b2f03ef77262c2bd49e6' }
},
{
$sort: { _id: -1 }
}])
该集合可能不会在owner_id上建立索引。尝试使用下面提到的索引创建查询,然后重新运行以前的代码。
db.collection('collection_name').createIndexes({ owner_id:1}) //Simple Index
or
db.collection('collection_name').createIndexes({ owner_id:1,_id:-1}) //Compound Index
**注意::如果您还不知道如何复合索引,则可以在用于匹配或排序的所有键上分别创建简单索引,这也应该使查询效率更高。
答案 1 :(得分:0)
查询速度取决于很多因素。集合的大小,文档的大小,在集合上定义的索引(以及在查询中正确使用的索引),硬件组件(例如CPU,RAM,网络)以及在查询运行时正在运行的其他进程。>
您必须知道正在讨论的集合上定义了哪些索引以进行进一步分析。该命令将检索它们:import { Component, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
modeNewEntry = false;
@ViewChild('textCreate', { static: false }) textCreateComponent: ElementRef;
showComponent() {
this.modeNewEntry = true;
this.textCreateComponent.nativeElement.scrollIntoView();
}
}
请注意,db.collection.getIndexes()
字段上的唯一索引是默认创建的,无法修改或删除。
(i)
但是,如果我尝试查询:
_id
,那就是 只需0.7s。
查询速度更快,因为db.collection.aggregate( [ { $sort : { _id : -1 } } ] )
字段上有一个索引,该索引在排序过程中使用。聚合查询使用具有排序阶段以及何时在管道中进行这种排序的索引。您可以通过生成查询计划来验证是否使用了索引(将_id
与explain
模式一起使用)。生成的查询计划中将进行索引扫描(IXSCAN)。
(ii)
executionStats
上面的查询需要20秒。
当我尝试此查询时,仅需0.781s。
db.collection.aggregate([ { $match: { owner_id: '5be9b2f03ef77262c2bd49e6' } }, { $sort: { _id: -1 } } ])
为什么按_id排序比按创建的字段慢?
无法根据可用信息得出任何结论。 通常,聚合查询中较早出现的db.collection.aggregate([
{
$match: { owner_id: '5860457640b4fe652bd9c3eb' }
},
{
$sort: { created: -1 }
}
])
和$match
阶段可以使用在操作中使用的字段上创建的任何索引。
生成查询计划将揭示问题所在。
请以$sort
模式运行explain
,并发布所有相关查询的查询计划详细信息。有关使用 explain 的生成查询计划的Mongodb v3.0.0版本的文档:db.collection.explain()