我使用的是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}
使用这些配置,我对上述查询的结果会变慢。请建议如何优化/改善查询时间。
编辑:
<\ n>碎片机规格:Cores: 32
RAM: 128g
HD: 160G
存储引擎是wiredTiger
可以在此link找到explain()查询。
答案 0 :(得分:0)
在这种情况下,因为您在一个系统上运行所有分片
&#34; shardName&#34; :&#34; shard0000&#34;,&#34; connectionString&#34; :&#34; localhost:27012&#34;,
&#34; shardName&#34; :&#34; shard0001&#34;,&#34; connectionString&#34; :&#34; localhost:27013&#34;,
&#34; shardName&#34; :&#34; shard0002&#34;,&#34; connectionString&#34; :&#34; localhost:27014&#34;,
最好避免使用分片,因为它们正在为系统资源而战。