mongodb读取性能改进
在mongodb中,我们存储包含以下字段的平面数据(我们的事件对象):mongodb读取性能改进,mongodb,mongodb-query,Mongodb,Mongodb Query,在mongodb中,我们存储包含以下字段的平面数据(我们的事件对象): EventReceivedTimeStamp 事件状态(已发送、失败、拒绝) 独一无二的 系统(5个系统) 触发器(20个触发器) 错误信息 数据大小和更新 数据统计:2.7亿条 每天更新:300万次(每天新增300万次,删除300万次) 文档大小:约2-3KB 搜索条件: EventReceivedTime范围和状态 事件接收范围和系统以及触发器和状态 唯一Id 我们在上述字段上创建了复合索引/索引 在对数据集执行搜索
- 数据统计:2.7亿条
- 每天更新:300万次(每天新增300万次,删除300万次)
- 文档大小:约2-3KB
{
"_id" : ObjectId("570cd8a55b66f3af1b4bd17e"),
"_class" : "com.companyName.commons.dto.EventRecord",
"uuid" : BinData(3,"10OXD+C51CEXS4E8jz0vnQ=="),
"moc" : "APP_NOTIFICATION",
"eventReceivedDateTime" : ISODate("2016-04-12T11:14:43.766Z"),
"retryAttemptsMade" : 0,
"retryAttemptDateTime" : ISODate("2016-04-12T11:14:43.766Z"),
"eventStatus" : "FAILED",
"systemName" : "OMS",
"triggerName" : "COD_ORDER_NIGHT",
"referenceId" : "39437515",
"aggregatorBased" : true,
"sentToDndQueue" : false,
"lastProcessedDateTime" : ISODate("2016-04-12T11:14:44.294Z"),
"errorMessage" : "Exception in validating attributes ",
"suborderCodes" : [
"39437515"
],
"dndEvent" : false
}
**db.collection_name.getIndices()**
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"uuid" : 1
},
"name" : "uuid",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"moc" : 1
},
"name" : "moc",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"eventReceivedDateTime" : 1
},
"name" : "eventReceivedDateTime",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"retryAttemptsMade" : 1
},
"name" : "retryAttemptsMade",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"retryAttemptDateTime" : 1
},
"name" : "retryAttemptDateTime",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"eventStatus" : 1
},
"name" : "eventStatus",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"systemName" : 1
},
"name" : "systemName",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"triggerName" : 1
},
"name" : "triggerName",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"referenceId" : 1
},
"name" : "referenceId",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"aggregatorBased" : 1
},
"name" : "aggregatorBased",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"salesforceTagged" : 1
},
"name" : "salesforceTagged",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"sentToDndQueue" : 1
},
"name" : "sentToDndQueue",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"senderId" : 1
},
"name" : "senderId",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"lastProcessedDateTime" : 1
},
"name" : "lastProcessedDateTime",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"errorMessage" : 1
},
"name" : "errorMessage",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"suborderCodes" : 1
},
"name" : "suborderCodes",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"dndEvent" : 1
},
"name" : "dndEvent",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"eventStatus" : 1,
"eventReceivedDateTime" : 1
},
"name" : "SDR",
"ns" : "admin.event_record"
},
{
"v" : 1,
"key" : {
"triggerName" : 1,
"eventStatus" : 1,
"systemName" : 1,
"eventReceivedDateTime" : 1
},
"name" : "STSDR",
"ns" : "admin.event_record"
}
]
注意:将共享解释输出这取决于您如何创建复合索引。创建复合索引时,请确保检查如何在集合上运行查询。定义复合索引,使索引的第一个键是匹配的(在查询-equal语句中),然后在查询中添加基于范围的键。参考 另外,确保您有足够的内存(RAM)来处理数据集。您可以参考官方MongoDB文档-。1)。您可以使用批量操作来读取、写入和更新。它大大缩短了时间 2) 。创建架构,使一起使用的字段位于一个集合中 3) 。您必须加快搜索速度,因为即使写入数据需要搜索现有数据。所以,勇敢地制作索引。如果创建更多索引,数据写入操作会变慢。(此外,还需要更新索引)
4) 。使用uniqeId作为_id我们通过以下方式改进了查询的性能: 1) 更改了分页逻辑。我们不再使用pageNumber/PageSize,而是开始使用上次响应中发送的最后一个元素的id
2) 其次,我们开始提示我们的查询,以便它应该使用适当的复合索引。是否使用索引?你能为我们提供示例数据流吗?我们这里需要硬数据:示例文档、查询、输出
yourQuery.explain()
、输出db.yourcoll.getIndexes()
@MarkusWMahlberg:我已经将示例文档与索引一起共享了。我将在一段时间内分享解释输出,因为我们的数据在云上,而我现在无法访问它。谢谢如果你有帮助的话,请考虑投票。这将有助于其他人解决同样的问题。