MongoDB 索引
索引在任何資料庫中都非常重要,而 MongoDB 沒有什麼不同。通過使用索引,在 MongoDB 中執行查詢變得更有效率。
如果你有一個包含數千個沒有索引的文件的集合,然後你查詢以查詢某些文件,那麼在這種情況下,MongoDB 需要掃描整個集合以查詢文件。但是如果你有索引,MongoDB 會使用這些索引來限制必須在集合中搜尋的文件數量。
索引是儲存集合資料的部分部分的特殊資料集。由於資料是部分資料,因此更容易讀取此資料。此部分集儲存特定欄位的值或按欄位值排序的一組欄位。
在本教程中,你將學習 -
-
瞭解指數的影響
-
建立索引
-
尋找指數
-
刪除索引
瞭解索引的影響
現在,即使從介紹中我們已經看到索引對查詢有好處,但索引太多會降低其他操作的速度,例如插入,刪除和更新操作。
如果對文件執行頻繁的插入,刪除和更新操作,則索引需要經常更改,這只是集合的開銷。
下面的示例顯示了哪些欄位值可以構成集合中的索引的示例。索引可以僅基於集合中的一個欄位,也可以基於集合中的多個欄位。
在下面的示例中,Employeeid 1
和 EmployeeCode AA
用於索引集合中的文件。因此,在進行查詢搜尋時,這些索引將用於快速有效地在集合中查詢所需的文件。
因此,即使搜尋查詢基於 EmployeeCode AA
,也將返回該文件。
{
Employeeid : 1
EmployeeCode : AA
EmployeeName : "Joe"
Awards : 1
Country : US
}
Mongodb createIndex()
- 建立索引
使用 createIndex
方法在 MongoDB 中建立索引。
以下示例顯示瞭如何完成此操作。假設我們有相同的 Employee 集合,其欄位名稱為 Employeeid
和 EmployeeName
。
> db.Employee.createIndex({Employeeid:1})
程式碼說明:
createIndex
方法用於根據文件的Employeeid
建立索引。1
參數列示當使用Employeeid
欄位值建立索引時,它們應按升序排序。請注意,這與_id 欄位(id 欄位用於唯一標識集合中的每個文件)不同,後者由 MongoDB 在集合中自動建立。現在,文件將按Employeeid
排序,而不是_id 欄位。
如果命令執行成功,將顯示以下輸出:
輸出:
> db. Employee.createIndex({Employeeid:1})
{
"createdcollectionAutomatically": false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
numIndexesBefore: 1
表示在執行命令之前索引中存在的欄位值(集合中的實際欄位)的數量。請記住,每個集合都有_id 欄位,該欄位也計入索引的欄位值。由於_id 索引欄位是最初建立時集合的一部分,因此numIndexesBefore
的值為 1。numIndexesAfter: 2
表示命令執行後索引中存在的欄位值的數量。- 此處
ok: 1
輸出指定操作成功,並將新索引新增到集合中。
上面的程式碼顯示瞭如何基於一個欄位值建立索引,但是也可以基於多個欄位值建立索引。
以下示例說明了如何完成此操作;
> db. Employee.createIndex({Employeeid:1 , EmployeeName:1})
程式碼說明:
createIndex
方法現在考慮多個 Field 值,這些值現在將導致基於Employeeid
和EmployeeName
建立索引。Employeeid:1
和EmployeeName:1
表示應在這兩個欄位值上建立索引,其中:1
表示它應按升序排列。
Mongodb getindexes()
- 查詢索引
在 MongoDB 中查詢索引是通過使用 getIndexes
方法完成的。
以下示例說明了如何完成此操作;
> db.Employee.getIndexes()
程式碼說明:
getIndexes
方法用於查詢集合中的所有索引。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.getIndexes()
[
{
"v" : 1,
"Key" : {
"_id" : 1
},
"name" : "_id",
"ns" : "Employee.Employee"
},
{
"v" : 2,
"key" : {
"Employeeid" : 1
},
"name" : "Employeeid_1",
"ns" : "Employee. Employee"
}
]
- 輸出返回一個文件,該文件只顯示集合中有 2 個索引,即_id 欄位,另一個是 Employee id 欄位。 :1 表示索引中的欄位值按升序建立。
Mongodb dropindex()
- 刪除索引
使用 dropIndex
方法刪除 MongoDB 中的索引。
以下示例說明了如何完成此操作;
> db.Employee.dropIndex({Employeeid:1})
程式碼說明:
dropIndex
方法獲取需要從索引中刪除的必需欄位值。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.dropIndex({Employeeid:1})
{ "nIndexesWas" : 3, "ok" : 1}
nIndexesWas:3
表示在執行命令之前索引中存在的欄位值的數量。請記住,每個集合都有_id 欄位,該欄位也計入索引的欄位值。ok:1
輸出指定操作成功,並從索引中刪除Employeeid
欄位。
要在集合中一次刪除所有索引,可以使用 dropIndexes
命令。
以下示例顯示瞭如何完成此操作。
> db.Employee.dropIndexes()
程式碼說明:
dropIndexes
方法將刪除除_id 索引之外的所有索引。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.dropIndexes()
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" ; 1
}
nIndexesWas:2
表示在執行命令之前索引中存在的欄位值的數量。- 再次記住,每個集合都有_id 欄位,該欄位也被視為索引的欄位值,MongoDB 不會將其刪除,這就是此訊息所指示的內容。
ok:1
輸出指定操作成功。