2013-06-20 75 views
2

我新手在蒙戈數據庫,curenttly裝箱使用此如何加快蒙戈查詢

db.element.aggregate([{ 
    "$match": { 
    "versions.branch": branch 
    } 
}, { 
    "$match": { 
    "$or": [{ 
     "doctype": "10921" 
    }, { 
     "doctype": "10926" 
    }, { 
     "doctype": "10943" 
    }, { 
     "doctype": "10945" 
    }, { 
     "doctype": "13162" 
    }, { 
     "doctype": "1521" 
    }, { 
     "doctype": "15281" 
    }, { 
     "doctype": "15282" 
    }, { 
     "doctype": "15283" 
    }, { 
     "doctype": "15284" 
    }, { 
     "doctype": "15291" 
    }, { 
     "doctype": "15372" 
    }, { 
     "doctype": "15431" 
    }, { 
     "doctype": "1545" 
    }, { 
     "doctype": "1550" 
    }, { 
     "doctype": "1551" 
    }, { 
     "doctype": "1555" 
    }, { 
     "doctype": "15514" 
    }, { 
     "doctype": "15516" 
    }, { 
     "doctype": "15517" 
    }, { 
     "doctype": "15518" 
    }, { 
     "doctype": "15519" 
    }, { 
     "doctype": "1553" 
    }, { 
     "doctype": "15542" 
    }, { 
     "doctype": "17402" 
    }, { 
     "doctype": "19009" 
    }, { 
     "doctype": "19055" 
    }, { 
     "doctype": "19073" 
    }, { 
     "doctype": "19082" 
    }, { 
     "doctype": "19083" 
    }, { 
     "doctype": "19812" 
    }, { 
     "doctype": "2134" 
    }, { 
     "doctype": "2400" 
    }, { 
     "doctype": "2401" 
    }] 
    } 
}, { 
    "$match": { 
    "prefix": { 
     "$ne": "500" 
    } 
    } 
}, { 
    "$sort": { 
    "id": 1 
    } 
}, { 
    "$unwind": "$versions" 
}, { 
    "$match": { 
    "versions.branch": branch 
    } 
}, { 
    "$unwind": "$versions.labels" 
}, { 
    "$group": { 
    "_id": { 
     "$toUpper": "$_id" 
    }, 
    "id": { 
     "$addToSet": "$product_name" 
    }, 
    "max": { 
     "$max": "$versions.name" 
    }, 
    "author": { 
     "$addToSet": "$versions.author" 
    }, 
    "labels": { 
     "$addToSet": "$versions.labels" 
    }, 
    "branch": { 
     "$addToSet": "$versions.branch" 
    }, 
    "level": { 
     "$addToSet": "$level" 
    }, 
    "vob": { 
     "$addToSet": "$vob" 
    }, 
    "Name": { 
     "$addToSet": "$_id" 
    }, 
    "is_product": { 
     "$addToSet": "$is_product" 
    }, 
    "prefix": { 
     "$addToSet": "$prefix" 
    }, 
    "decclass": { 
     "$addToSet": "$doctype" 
    }, 
    "product_number": { 
     "$addToSet": "$versions.product_number" 
    }, 
    "status": { 
     "$addToSet": "$versions.status" 
    }, 
    "revision": { 
     "$addToSet": "$versions.revision" 
    }, 
    "variant": { 
     "$addToSet": "$versions.variant" 
    } 
    } 
}, ]) 

web應用程序很慢,而且要加快Web應用程序,你可以建議我做什麼,要創建哪些索引,查詢的順序是否好?或任何其他消化。我創建索引

db.element.ensureIndex({product_name: 1, doctype: 1, prefix: 1}) 

應該使用compund索引或其他?此外,當我試圖創建索引

db.element.ensureIndex({versions.branch: 1, doctype: 1, prefix: 1}) 
Thu Jun 20 09:45:54.983 JavaScript execution failed: SyntaxError: Unexpected token . 
+0

爲什麼不使用$ in查詢該$或?並結合這些匹配,以便索引可以完全使用? – Sammaye

+0

有什麼區別,是$ in或$或者更快,我可以使用$ in .... – user2504148

+2

$ in會快100倍,一個$或者就像是對每個子句進行並行查詢,這很慢,加上索引使用不如$ – Sammaye

回答

5

幾件事情,你可以在這裏做:

首先,在代替$或使用$。其次,MongoDB可以只用爲你的第一場比賽使用一個索引,所以你將不得不決定(通過嘗試)兩場比賽哪一場比較好。目標是儘可能快地查詢,並減少通過管道的文檔數量。對於您做以下事情:

首先,創建三個指標:

db.element.ensureIndex({ 'versions.branch' : 1 }); 
db.element.ensureIndex({ 'doctype' : 1 }); 
db.element.ensureIndex({ 'prefix' : 1 }); 

然後運行以下三個查詢,並注意「光標」,「N」,「nScanned」和「MS」田:

branch = "nameofbranch"; // guessing here 
db.element.find("versions.branch": branch).explain(); 
db.element.find("doctype" { $in: [ "15281", "15282" .... ] }).explain(); 
db.element.find("prefix": { $ne: "500" }).explain(); 

在過去的查詢,你會注意到,「光標」是「BasicCursor」,因爲$ NE查詢不能使用索引。

另外兩個將顯示「ms」,「n」和「nScanned」的各種值。 「ms」是運行查詢所用的時間。如果這大致相同,則查看「n」和「nScanned」值之間的差異。我期待並猜測「versions.branch」查詢的區別是0.對於「doctype」查詢,它可能會有所不同。 如果「ms」不是大致相同,則將$ match作爲您的聚合管道中最快的第一個作爲$ match子句。

如果速度(「ms」)都相同,請檢查「n」個值。如果「前綴」查詢的「n」是「5」,而「versions.branch」查詢的「n」是「500」,那麼這意味着「前綴」查詢的結果更好,因爲更少文件被退回。在這種情況下,把它作爲你的第一個$ match子句進行聚合。如果「versions.branch」少得多,那麼使用它作爲第一個$ match子句。