創(chuàng)建索引
MongoDB的索引機制與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫索引幾乎是一樣的,絕大多數(shù)優(yōu)化SQL索引的技巧也都適用于MongoDB。索引會增加數(shù)據(jù)插入、更新和刪除的性能開銷,應(yīng)避免為每個鍵都創(chuàng)建索引。
// 創(chuàng)建 索引
db . things . ensureIndex ({
'j ' : 1
});
// 創(chuàng)建子文檔 索引
db . things . ensureIndex ({
'user.Name ' : - 1
});
// 創(chuàng)建復(fù)合索引
db . things . ensureIndex ({
'j ' : 1 , // 升序
'x ' : - 1 // 降序
});
/*
如果您的 find 操作只用到了一個鍵,那么索引方向是無關(guān)緊要的;當創(chuàng)建復(fù)合索引的時候,一定要謹慎斟酌每個鍵的排序方向 。
* /
修改索引
// 修改索引,只需要重新運行索引命令即可
// 如果索引已經(jīng)存在則會重建, 不存在的索引會被 添加
db . things . ensureIndex ({
// 原來的索引會 重建
'user.Name ' : - 1 ,
// 新增一個升序 索引
'user.Name ' : 1 ,
// 為 Age 新建降序 索引
'user.Age ' : - 1
}, {
// 打開后臺執(zhí)行
‘background' : true
});
// 重建索引
db. things .reIndex();
注意:MongoDB不會檢查要索引的鍵名是否真的存在。當background為false或未指定時,創(chuàng)建索引的過程會以阻塞的形式運行,此時MongoDB無法處理任何請求。
刪除索引
如果刪除整個集合(drop)也會刪除集合中的索引。如果是刪除集合中所有的文檔(remove)則不會影響索引,當有新文檔插入時,索引就會重建。
// 刪除集合中的所有 索引
db . things . dropIndexes ();
// 刪除指定鍵的索引
db . things . dropIndex ({
x : 1 ,
y : - 1
});
// 使用 command 刪除指定鍵的 索引
db . runCommand ({
dropIndexes : 'foo ' ,
index : { y : 1 }
});
// 使用 command 刪除所有 索引
db . runCommand ({
dropIndexes : 'foo ' ,
index : '*‘
});
唯一索引
// 創(chuàng)建唯一索引,同時這也是一個符合唯一索引
db . things . ensureIndex (
{
'firstName ' : 1 ,
'lastName ' : 1
}, {
// 指定為唯一索引
'unique ' : true ,
// 刪除重復(fù) 記錄
'dropDups ' : true
});
注意:
1、_id本身就是個唯一索引,不同的是,它不能被刪除;
2、刪除重復(fù)記錄時,僅會按順序保留第一文檔;
3、如果創(chuàng)建了唯一索引,但文檔并不包含該鍵,默認以null存儲,因此如果發(fā)現(xiàn)了第二項未指定該鍵或該鍵被指定為null的記錄,就會被認為是重復(fù)的;
4、所謂復(fù)合唯一索引,允許單鍵重復(fù),但組合起來之后是不允許重復(fù)的;
地理空間索引 - 創(chuàng)建
不了解神馬是地理空間?先看下百度的解釋吧【地理空間】!
MongoDB為處理地理空間信息增加了一個專門的索引結(jié)構(gòu)——2d,對就是二弟!
要使用二弟索引,表示地理坐標的鍵必須是一個長度為2的數(shù)組。然后為該鍵創(chuàng)建取值為“2d”的索引即可。請看下面代碼實例。
// 文檔 格式
{
'_ id' : 1 ,
'name ' : ' 天安門 ' ,
'location' :[
116.12345 ,
39.54321
]
}
// 創(chuàng)建地理空間 索引
db . map . ensureIndex ({
'location ' : '2d‘
});
MongoDB的地理空間索引的取值沒有單位,這意味著你可以為其設(shè)置任何單位。默認地理空間索引的假設(shè)值是-180 ~ 180。如果需要自定義其他的取值范圍,請參考下面代碼實例。
// 創(chuàng)建地理空間 索引
db . map . ensureIndex ({
'location ' : '2d‘
}, {
'min ' : - 10000 ,
'max ' : 10000
});
地理空間索引 - $NEAR
$near操作符與geoNear Command的區(qū)別在于:geoNear會同時返回每個地標與給定中心點的距離(注意,這里的距離沒有單位)。
// $near 操作符
db . places . find ({
loc : {
// 中心點
$ near : [ 50 , 50 ],
// 查詢半徑
$ maxDistance : 5
}
}). limit ( 20 );
// 如果沒有指定 limit ,其默認值為 100
地理空間索引 - $WITHIN(BOX)
$within操作符支持以下幾個選項:
• $box:矩形查找
• $center:圓形查找
• $polygon:多邊形查找(v1.9+支持)
$box實例
// 定義一個矩形 區(qū)域
var box = [
// 左 上角
[ 40.73083 , - 73.99756 ],
// 右 下角
[ 40.741404 , - 73.988135 ]
];
// 查找
db . places . find ({
" loc" : {
"$ within" : {
"$ box" : box
}
}
});
$center實例
// 定義 中心點
var center = [ 50 , 50 ];
// 定義查找 半徑
var radius = 10 ;
// 查找
db . places . find ({
" loc" : {
"$ within" : {
// 注意這里是數(shù)組傳遞
"$ center" : [
center ,
radius
]
}
}
});
$polygon實例
小結(jié)
1、索引可以加速查詢;
2、單個索引無需在意其索引方向;
3、多鍵索引需要慎重考慮每個索引的方向;
4、做海量數(shù)據(jù)更新時應(yīng)當先卸載所有索引,待數(shù)據(jù)更新完成后再重建索引;
5、不要試圖為每個鍵都創(chuàng)建索引,應(yīng)考慮實際需要,并不是索引越多越好;
6、唯一索引可以用來消除重復(fù)記錄;
7、地理空間索引是沒有單位的,其內(nèi)部實現(xiàn)是基本的勾股定理算法。
新聞熱點
疑難解答