我有一个mysql作为主数据库,mongodb作为辅助数据库。 我对生产运行查询,运行时间超过5秒。
当我使用explain
运行时,这是我的查询{
"cursor" : "BtreeCursor host_1_type_1 multi",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 313566,
"nscannedObjectsAllPlans" : 313553,
"nscannedAllPlans" : 627118,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 14,
"nChunkSkips" : 0,
"millis" : 6555,
"indexBounds" : {
"host" : [
[
"",
{
}
],
[
/shannisideup/i,
/shannisideup/i
]
],
"type" : [
[
"ambassador-profile",
"ambassador-profile"
]
]
},
"server" : "mongoserver:27017"
}
我添加了索引
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "db.visitor",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"host" : 1,
"type" : 1
},
"ns" : "db.visitor",
"name" : "host_1_type_1"
}
]
但我仍然不知道为什么运行查询时这么慢?
db.visitor.find({ host:/shannisideup/i, type:"ambassador-profile" }).limit(1)
仅供参考我为我的应用程序和AWS云中的mongodb服务器运行不同的服务器。 对于运行EC2 m3.medium的mongodb,我尝试提高openfile限制,正如mongodb网站建议的那样。我的mongodb运行在通过/ dev / sdf安装的单独的100GB磁盘上。 我运行mongodb版本2.4.5 当我的mongodb运行时,CPU负载几乎总是100%
opcounter的我的MMS统计信息是:
命令:19.11
查询:13.79
更新:0.03
删除:0.00001
getmore:0
插入:0.03
我的最高Pagefaults是0.02
我可以做些什么来优化我的mongodb到不到1秒?
答案 0 :(得分:0)
我将通过一些应该有所帮助的事情,尽管我想事先明确表示不区分大小写的正则表达式搜索(" host:/ shannisideup / i")不能使用索引因此,您可以使用此数据模型和搜索进行限制。您可以看到它正在扫描大量对象(" nscanned":313566)只是为了返回1个文档。
要做的事情:
使用更快的CPU升级您的实例 - 期间100%的CPU负载 这种情况下,不敏感的搜索有时是一个明确的指标 你的数据库是cpu绑定的。更快的CPU将有所帮助。更多的记忆 (当你搬到一个时,它通常与Amazon EC2实例一起提供 更快的cpu)也不会受伤。与更快的磁盘(SSD)相同。
在将主机字段存储到MongoDB中之前小写主机字段 - 如果您 以小写形式存储所有主机,然后小写搜索 搜索之前的字符串,你可以摆脱不区分大小写的标志 为正则表达式。如果你可以将它与你的前缀运算符结合起来 正则表达式,你将能够使用有帮助的索引。
考虑使用专用的文本搜索产品(如Solr或 Elasticsearch)用于主机查询。 MongoDB在其文本中受到限制 搜索功能,特别是关于外卡搜索。 您可能会发现像Elasticsearch或Solr这样的东西可能会提供 更好的表现。
您可能会发现一些有用的链接:
http://docs.mongodb.org/manual/reference/operator/query/regex/
http://selectnull.leongkui.me/2014/02/02/mongodb-elasticsearch-perfect-nosql-duo/