【发布时间】:2018-01-09 15:01:37
【问题描述】:
我有一个收藏产品,里面有 ~7.000.000 本书,总共有 ~40GB mongodb 3.4 数据库。以下是一本书文档的示例:
{
"_id" : ObjectId("597f17d22be7925d9a056e82"),
"ean13" : "9783891491904",
"price" : NumberInt(2100),
"name" : "My cool title",
"author_name" : "Doe, John",
"warengruppe" : "HC",
"book_category_key" : "728",
"keywords": ["fairy tale", "magic", "fantasy"]
...
}
当我用limit查询数据库时,时机还可以。但是如果我计算查询(用于分页),那么它需要很长时间:
2017-08-02T13:03:16.088+0200 I COMMAND [conn74] command mydb.products command: count { count: "products", query: { book_category_key: { $in: [ "120", "130" , "180", "111", "112", "140", "150", "160", "170", "190", "1AA" ] } }, readConcern: {} } planSummary: IXSCAN { book_category_key : 1 } keysExamined:1129826 docsExamined:1129825 numYields:8851 reslen:44 locks:{ Global: { acquireCount: { r: 17704 } }, Database: { acquireCount: { r: 8852 } }, Collection: { acquireCount: { r: 8852 } } } 协议:op_query 7008ms
这是一个很好的查询:
{
count: "products",
query: {
book_category_key: {
$in: ["120",
"130",
"180",
"111",
"112",
"140",
"150",
"160",
"170",
"190",
"1AA"]
}
}
这需要 7 秒,有时甚至更长(最多 20 秒)。我在 book_category_key 上有一个索引:
{
"v" : 2,
"name" : "book_category_key_1",
"ns" : "mydb.products",
"background" : true
}
【问题讨论】:
-
嗨,您是否尝试过对单个字段进行计数(所以如果 SQL 不是 count(*) 而是 count(key) ..
-
这是什么意思?如何在 mongodb 中做到这一点?
-
好像是在使用磁盘,或者后台有一些繁重的操作。您能否在运行查询时检查currentOp 中的
timeAcquiringMicros。 -
它是我自己的服务器,没有人在上面,没有其他服务在运行(只有 apache 和 mongodb),它有 32gb ram 和一个 ssd 作为磁盘。 find-query 设置相同,但限制为 9,skip 仅需 300ms。
-
如果您只对匹配的数量感兴趣,将其设为covered query 可能会有所帮助:
db.products.find('book_category_key':{$in:<yourArray>},{'_id':0,'book_categoryfkey':1}).count()
标签: mongodb