MongoDb 中基于慢范围的查询
Posted
技术标签:
【中文标题】MongoDb 中基于慢范围的查询【英文标题】:Slow Range Based Queries in MongoDb 【发布时间】:2016-08-15 17:47:08 【问题描述】:我使用的是 MongoDb 3.2,数据集大小为 9000 万,其中文档结构包括:
_id
eventReceivedDateTime(Date)
systemName(String)
triggerName(String)
eventStatus (Enum with 4 possible values)
要执行的查询是:
1) 涉及eventStatus
和eventReceivedDateTime
的基于范围的查询,例如:
db.event_record.find(
"eventStatus": "SENT",
"eventReceivedDateTime":
"$gt": ISODate("2016-04-19T23:46:30.827Z"),
"$lt": ISODate("2016-04-21T14:18:30.827Z")
).count();
2) 涉及eventStatus
& eventReceivedDateTime
和_id
并涉及排序的基于范围的查询。 (用于分页),例如:
db.event_record.find(
"eventStatus": "SENT",
"eventReceivedDateTime":
"$gt": ISODate("2016-04-19T23:46:30.827Z"),
"$lt": ISODate("2016-04-21T07:18:30.827Z")
,
"_id":
"$gt": ObjectId("57173a67e4b09ca56feddddf")
).sort("_id":1).limit(10);
3) 涉及eventStatus
、eventReceivedDateTime
、systemName
和triggerName
的基于范围的查询,例如:
db.event_record.find(
"eventStatus":"SENT",
"eventReceivedDateTime":
"$gt": ISODate("2016-04-19T23:46:30.827Z"),
"$lt": ISODate("2016-04-21T07:18:30.827Z")
,
"systemName": "OMS",
"triggerName": "COD_ORDER"
).count();
4) 涉及eventStatus
、eventReceivedDateTime
、systemName
、triggerName
和_id
并涉及排序的基于范围的查询。 (用于分页),例如:
db.event_record.find(
"eventStatus": "SENT",
"eventReceivedDateTime":
"$gt": ISODate("2016-04-19T23:46:30.827Z"),
"$lt": ISODate("2016-04-21T07:18:30.827Z")
,
"systemName": "OMS",
"triggerName": "COD_ORDER",
"_id":
"$gt":ObjectId("57173a67e4b09ca56feddcd6")
).sort("_id":1).limit(10);
每天将插入和删除大约 300 万个文档。
我制作了以下复合索引:
'eventStatus':1,'eventReceivedDateTime':1,'_id':1
'eventStatus':1,'systemName':1,'triggerName':1,'eventReceivedDateTime':1
'eventStatus':1,'systemName':1,'triggerName':1,'eventReceivedDateTime':1,'_id':1
我使用 shardkey 在同一台机器上使用 3 个 Shard 实例:
'eventStatus':1,'eventReceivedDateTime':1
使用这些配置,上述查询的结果很慢。请建议如何优化/改进查询时间。
编辑:
分片机规格:
Cores: 32
RAM: 128g
HD: 160G
存储引擎是wiredTiger
explain() 可以在link 找到查询。
【问题讨论】:
1.你能告诉我们解释执行统计转储db.col.query.explain("executionStats")
2. 你有什么样的硬件/系统规格? 3. 使用的是什么存储引擎?
@profesor79 我已经添加了信息。
还有一个问题,处理器时钟是多少?
【参考方案1】:
在这种情况下,因为您在一个系统上运行所有分片
"shardName" : "shard0000","connectionString" : "localhost:27012",
"shardName" : "shard0001","connectionString" : "localhost:27013",
"shardName" : "shard0002","connectionString" : "localhost:27014",
最好避免使用分片,因为它们正在争夺系统资源。
【讨论】:
以上是关于MongoDb 中基于慢范围的查询的主要内容,如果未能解决你的问题,请参考以下文章