Mongodb基礎入門(3) 排序和索引

2022-04-08 18:23:55 字數 3237 閱讀 8976

今天繼續mongodb,簡單的記錄下其排序和索引的使用。

在mongodb中使用sort()方法對資料進行排序。

命令格式:db.collectionname.find().sort()

引數說明:

-1:表示降序

1:表示公升序(預設)

doc集合中資料如下:

> db.doc.find({},)

> db.doc.find({},).sort()

索引1、 簡介

和mysql資料類似,為了提高查詢效率,mongodb也提供索引的支援。在mongodb中,索引可以按照字段進行公升序/降序來建立,以便於排序。當然,mongodb預設採用b-tree方式來索引。

按索引作用型別可分為:

1、 單列索引:在單個鍵上建立索引。

2、 組合索引:在多個鍵上同時建立索引,也叫多列索引。

3、 文件索引:任何型別,包括文件(document)都可以作為索引。

索引的性質可以分:

1、 普通索引:普通方式建立的索引。注意:mongodb存在預設的_id的鍵,相當於主鍵。集合在建立之後,系統會自動在_id建立索引,該索引為系統預設,無法刪除。

2、 唯一索引:某列為唯一索引時,不能新增重複文件。注意,如果文件不存在指定欄位時,會將該字段預設為null,而null也會被認為重複。

3、 稀疏索引:和稀疏矩陣類似,稀疏索引就是將含有某個欄位的文件進行索引,不包含該字段的文件則進行索引。一般在小部分文件含有某列時常用。

4、 雜湊索引:2.4版本新增的索引方式。相比於普通索引,其速度更快。但是無法對範圍查詢進行優化。多用於隨機性比較強的雜湊當中。

2、 檢視索引

db.collectionname.getindexes()

3、 建立索引

a、 建立普通單列索引:預設是公升序索引,採用b-tree方式

db.collectionname.ensureindex()//1:公升序;-1:降序

b、 建立多列索引:

db.collectionname.ensureindex()

c、 建立文件索引:

a)建立普通文件索引

db.collectionname.ensureindex()

> db.users.insert(})

writeresult()

>db.users.ensureindex()//將整個info文件作為索引

>db.users.getindexes()[,

"name" : "_id_",

"ns" : "test.users"},,

"name" : "info_1",

"ns" : "test.users"}]

注意:在使用索引查詢的時候需要按照事先文件欄位的順序。

> db.users.find(})//能夠利用索引查到結果 } 

>db.users.find(}})//能夠利用索引查到結果 } 

>db.users.find(})//不能利用索引查到結果

b)建立子文件索引

db.collectionname.ensureindex()

> db.users.ensureindex()

>db.users.getindexes()[,

"name" : "_id_",

"ns" : "test.users"},,

"name" : "info.city_1",

"ns" : "test.users"}]

d、建立唯一索引:可以針對多列建立唯一索引

db.collectinname.ensureindex(,)

e、建立稀疏索引:

db.collectionname.ensureindex(,)

f、 建立雜湊索引:可以對單個欄位或字文件建立hash索引,不能針對多個列。

db.collectionname.ensureindex()

4、 刪除索引

a、刪除單個索引:

db.collectionname.dropindex()

b、刪除所有索引:_id列的索引不會刪除。

db.collectionname.dropindexes()

注意:在關聯式資料庫中,表被刪除後,索引隨之刪除。

而在monodb中刪除集合,索引仍然存在,因此需要手動刪除索引。

5、 重建索引

乙個集合在經過多次修改之後,將會導致集合的檔案產生碎片。同樣索引檔案也會如此。因此可以通過索引的重建來減少索引檔案碎片,提高索引效率。和mysql中的optimize table類似。命令:db.collectionname.reindex().

索引的管理

1、查詢所有索引:

system.indexes集合中包含了每個索引的詳細資訊,因此可以通過該命令:

db.system.indexes.find()查詢已經存在的索引.

, "name": "_id_", "ns" : "test.doc" }

, "name": "_id_", "ns" : "test.category" }

, "name": "_id_", "ns" : "test.tea" }

,"name" : "sparse:1", "ns" : "test.tea"}

, "name": "_id_", "ns" : "test.users" }

,"name" : "info.city_1", "ns" :"test.users" }

2、檢視查詢計畫:

為了分析查詢效能及索引,一邊獲得更多查詢方面有用的資訊,可以使用如下命令:

db.collectionname.find(查詢表示式).explain()

"cursor" :"basiccursor" ——>表示索引沒有發揮作用

"nscanned":1 ——>表示查詢了多少個文件。

"n",:1 ——>表示返回的文件數量。

"millis":0 ——>表示整個查詢的耗時。

"nscannedobjects" : 11, ——>理論上需要掃瞄多少行

3、後台建立索引

為已有資料的文件建立索引時,為了不阻塞其他操作,同時可以在後台建立索引,可以使用命令:db.test.ensureindex(,)

相比阻塞建立索引而言,後台建立索引效率較低。  

注意1、如果資料集合比較小(一般來說是4m一下),此時如果使用sort()進行排序就不需要使用索引。

2、在使用組合索引查詢時,查詢欄位的順序必須和事先建立索引時的順序保持一致。否則會出現上文提到的出現查不到的情況。  

Redis入門 4 排序

很多場合需要對元素進行排序,這時除了使用有序集合外,還可以借助redis提供的sort命令來排序。sort命令可以對列表型別 集合型別和有序集合型別的鍵進行排序。sort key sort key desc sort key alphasort命令會根據元素自身的值進行排序,在對有序集合型別排序時會...

MySQL查詢 3 排序

為了方便檢視資料,可以對資料進行排序 語法 select from 表名 where order by 列1 asc desc 列2 asc desc,說明 例1 查詢未刪除學生的資訊,按名稱公升序 select from students where is delete 0 order by na...

3 排序檢索資料

3.1 排序資料 使用order by 子句 select prod name from products order by prod name 注意 使用order by 子句時,應該保證它是select語句中的最後一條子句。3.2 按多個列排序 select prod id,prod name,...