分享

为什么查询比在oracle下还慢

wasiker 发表于 2013-10-17 21:36:54 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 6481
{ "$and" : [ { "status" : 3} , { "auditstatus" : 1} , { "tickettype" : { "$in" : [ 1 , 3]}} , { "$or" : [ { "departureairport" : { "$regex" : "SHA"}} , { "departureairport" : "###"}]} , { "$or" : [ { "arrivalairport" : { "$regex" : "PEK"}} , { "arrivalairport" : "###"}]} , { "$or" : [ { "workweekday" : { "$regex" : "1"}} , { "workweekday" : ""}]} , { "policynum" : { "$gt" : 3.0}} , { "$and" : [ { "flightsdatestamp" : { "$lte" : 1378569600000}} , { "flightedatestamp" : { "$gte" : 1378569600000}}]} , { "$and" : [ { "sworktimestamp" : { "$lte" : 2820000}} , { "eworktimestamp" : { "$gte" : 2820000}}]}]}
以上在mongodb默认安装下,查询需要1000ms。在oracle只需要50ms。
求帮忙。是否可以优化mongodb
              
               
               

已有(4)人评论

跳转到指定楼层
u011235983 发表于 2013-10-17 21:37:45

            这个集合的索引都有哪些?
能否贴一下这个查询的所有查询计划( 如果是在mongo shell中运行查询,在查询后加.explain(true)可以显示所有的查询计划。如果是使用mongo驱动,可以在对应的驱动文档中找到explain方法)
http://docs.mongodb.org/manual/reference/method/cursor.explain/
        
回复

使用道具 举报

ACMAIN_CHM 发表于 2013-10-17 21:38:25

            很正常的事啊。如果随便一个数据库中的任意查询语句都比ORACLE快的话,那ORACLE根本就不可能再继续存在了。
        
回复

使用道具 举报

wasiker 发表于 2013-10-17 21:38:57

            


该表的索引和explain
        
回复

使用道具 举报

u011235983 发表于 2013-10-17 21:39:30

            这个查询语句的explain结果中cursor显示的是BasicCursor,表示没有使用索引,所以查询需要扫描整个FQ_POLICY集合。扫描整个集合需要把集合中所有的文档都读入到内存中,是特别费时的操作。
我调整了一下这个查询语句的结构,应该可以使用表索引了,您可以在测试环境里试试下面这个查询:
db.FQ_POLICY.find({
        "status" : 3,
        "auditstatus" : 1,
        "tickettype" : {
                "$in" : [
                        1,
                        3
                ]
        },
        "departureairport" : {
                "$in" : [
                        {
                                "$regex" : "SHA"
                        },
                        "###"
                ]
        },
        "arrivalairport" : {
                "$in" : [
                        {
                                "$regex" : "PEK"
                        },
                        "###"
                ]
        },
        "workweekday" : {
                "$in" : [
                        {
                                "$regex" : "1"
                        },
                        ""
                ]
        },
        "policynum" : {
                "$gt" : 3
        },
        "flightsdatestamp" : {
                "$lte" : 1378569600000
        },
        "flightedatestamp" : {
                "$gte" : 1378569600000
        },
        "sworktimestamp" : {
                "$lte" : 2820000
        },
        "eworktimestamp" : {
                "$gte" : 2820000
        }
}
)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条