今天繼續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,...