在MongoDB中索引动态查询的最佳方法

时间:2013-04-11 10:38:07

标签: performance mongodb indexing

我正在研究日志管理系统,用户可以从文件上传日志。我有'事件'集合,我存储来自所有来源的所有事件(每个来源可以有不同的日志格式,在一个集合中我可以有例如10 000 000条记录 - 5 000 000用于'source1'和5 000 000用于'source2' )。我想为用户提供过滤器选项(过滤器选项仅适用于源,因此用户可以按级别,数据等过滤数据),为了获得更好的性能,我想创建索引和复合索引。在用户将日志上载到系统之前,他/她将决定在过滤期间要使用哪些过滤器查询。所以我可以有不同的疑问。问题是我可以在一个集合中有许多不同的源,这意味着许多不同的过滤器查询,但mongoDB每个集合只允许64个索引。

那么,如果我想要具有良好的读取性能并且我希望让用户过滤日志(用户将决定在将日志上传到系统之前过滤数据的方式),那么最佳解决方案是什么?我正在考虑为每个源创建新的集合,因为每个集合永远不会达到64个索引。

查询示例:

db.events.ensureIndex({"source_id": 1, "timestamp" : 1})
db.events.ensureIndex({"source_id": 1, "timestamp" : 1, "level": 1})
db.events.ensureIndex({"source_id": 1, "diagnostic_context": 1})
db.events.ensureIndex({"source_id": 1, "timestamp" : 1, "statusCode": 1})
db.events.ensureIndex({"source_id": 1, "host" : 1}) 

事件收集样本:

{   _id: ObjectId("507f1f77bcf86cd799439011"),
    timestamp: ISODate("2012-09-27T03:42:10Z"),
    thread: "[http-8080-3]",
    level: "INFO",
    diagnostic_context: "User 99999",
    message: "existing customer saving"},
    source_id: "source1"
{   _id: ObjectId("507f1f77bcf86cd799439012"),
    host: "144.18.39.44",
    timestamp: ISODate("2012-09-01T03:42:10Z"),
    request: "GET /resources.html HTTP/1.1",
    statusCode: 200
    bytes_sent: 3458,
    url: "http://www.aivosto.com/",
    agent: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    source_id: "source2"
}

0 个答案:

没有答案