Ruby 为什么collections.find({})对250个对象占用9秒(MongoMapper)
我正在运行以下查询,返回结果平均需要9秒。它没有过滤器,所以我不确定索引是否有用。为什么跑得这么慢?其中只有250个对象,只有4个字段(全部为文本)Ruby 为什么collections.find({})对250个对象占用9秒(MongoMapper),ruby,ruby-on-rails-3,mongodb,mongomapper,Ruby,Ruby On Rails 3,Mongodb,Mongomapper,我正在运行以下查询,返回结果平均需要9秒。它没有过滤器,所以我不确定索引是否有用。为什么跑得这么慢?其中只有250个对象,只有4个字段(全部为文本) 机器上的cpu、内存和磁盘甚至没有注意到查询的运行。任何帮助都将不胜感激 使用以下方法在“国家/地区名称”字段上创建索引: db.countries.ensureIndex({country_name:1}); 这将大大加快您的查询速度 您可以了解有关索引的更多信息 PS- 您可以键入“it”以在看到“has more”短语时显示更多信息,也可以
机器上的cpu、内存和磁盘甚至没有注意到查询的运行。任何帮助都将不胜感激 使用以下方法在“国家/地区名称”字段上创建索引:
db.countries.ensureIndex({country_name:1});
这将大大加快您的查询速度
您可以了解有关索引的更多信息
PS-
您可以键入“it”以在看到“has more”短语时显示更多信息,也可以使用以下命令显示不带“has more”的所有结果:
db.countries.find({}, {'country_name' : 1, 'country_code' : 1}).forEach(printjson)
>use databaseName;
> db.setProfilingLevel(2); // 2 tell the profiler to catch everything happened inside the DB
并且,您始终可以使用以下命令设置探查器:
db.countries.find({}, {'country_name' : 1, 'country_code' : 1}).forEach(printjson)
>use databaseName;
> db.setProfilingLevel(2); // 2 tell the profiler to catch everything happened inside the DB
您可以了解有关探查器的更多信息
您可以使用
> db.system.profile.find()
此方法将为您提供有关数据库和内部情况的更多信息。您是否尝试在mongo shell中运行相同的查询?不,老实说,我在mongo shell中没有太多经验,我需要进行哪些语法更改,以便将其视为相同的查询?类似于:
db.countries.find({},{'country\u name':1,'country\u code':1})
好的,在mongo shell中,使用'has more'标记立即运行前20条记录的查询响应。如果我运行explain(),我会得到:“cursor”:“BasicCursor”,“nscanned”:247,“nscannedObjects”:247,“n”:247,“millis”:0,“nYields”:0,“nchunkSkips”:0,“isMultikey”:false,“indexOnly”:false,“indexBounds”:{}
那么,mongomapper内部出现了什么问题导致了这样的延迟?谢谢,运行db.countries.find({},{'country\u name':1,'country\u code':1})。forEach(printjson)在shell中执行并在毫秒内返回所有结果,正如我所期望的mongo。我将在我的ruby堆栈上安装一个探查器,看看是什么导致了一个查询,该查询应在毫秒内执行,并在秒内执行。让我知道,如果创建索引加快了查询速度,这是mongodb中的一个很好的功能。遗憾的是,这不是,但它可以我们发现这不是mongo,而是ruby驱动程序和to_json让事情变得慢了下来。我最终缓存了json结果,它工作得非常好。现在整个ajax调用在70ms内完成了端到端,很高兴听到现在一切都很好!如果您有更多问题,请发布更多!