- 高级索引主要实现对文档中子文档和数组建立索引,实现地理空间的数据索引。
- 高级索引的出现是为了更好地处理文档中的子文档和数组索引问题,同时也介绍了地理索引功能。
- 建立索引的唯一目的,是提高查询效率,所以必须清楚地了解建立索引所带来的限制条件,否则很可能好事变坏事。
1. 子文档索引
语法: db.collection_name.createIndex({key:n,key:n,…})
其中,key为指向文档的带“.”的字符串。 n的值为1或-1,表示升序或降序。
>use eshops
>db.books.insert(
[{name:"《生活百科故事1》",price:50,summary:{kind:"学前",content:"1-7岁使用"}},
{name:"《生活百科故事2》",price:50,summary:{kind:"少儿",content:"8-16岁使用"}},
{name:"《生活百科故事3》",price:50,summary:{kind:"成人",content:"18-60岁使用"}}])
db.books.createIndex({
"summary.kind":1,"summary. content ":-1
})//对一个子文档的两个键的值进行索引。
>db.books.find({"summary.kind":"少儿"}).pretty()
2. 数组索引
- 对数组建立索引时,MongoDB会为数组中指定元素创建一个索引键。
- 语法:db.collection_name.createIndex({key:n,key:n,…})
- 其中,key为指向数组的带“.”的字符串。n的值为1或-1,表示升序或降序
>db.books.insert(
[
{name:"《e故事》",price:30,tags:[{no:1,press:"x出版社"},{no:2,press:"y出版社"},{no:3,press:"z出版社"}]
},
{name:"《f故事》",price:30,tags:[{no:11,press:"x出版社"},{no:4,press:"y出版社"},{no:2,press:"z出版社"}]
}]
)//插入两个带数组的文档
>db.books.createIndex({"tags.no":1,"tags.press":-1})//对一个数组的两个键的值进行索引。
>db.books.find({"tags.no":2}).pretty()
注意:
- 多键值索引时,只能针对集合里一条文档的一个数组建立多键索引,不允许建立多数组索引。
- 不能为分片建立多键值索引
3、2dsphere索引(地理空间索引)
- 2dsphere索引支持所有MongoDB数据库中地理空间的查询:包含、交集和近邻的查询。并支持GeoJSON存储对象和普通坐标的数据。坐标顺序是:经度,纬度
- 语法:db.collection_name.createIndex({:”2dsphere”})
db.places.insert
([
{loc:{type:"Point",coordinates:[-73.97, 40.77]},
name:"Central Park",category:"Parks"},
{loc:{type:"Point",coordinates:[-73.88, 40.78]},
name:"La Guardia Airport",category:"Airport"}
]
)//插入两条地理空间属性文档数据
db.places.find()
db.places.createIndex({loc:"2dsphere"})//建立一个2dsphere索引
索引的限制
1、索引额外开销
建立一个索引至少需要8KB的数据存储空间,也就是索引是需要消耗内存和磁盘的存储空间的;
如果业务系统所使用的集合很少对集合进行读取操作,则建议不使用索引。
2、内存使用限制
索引在具体使用时,是驻内存中进行持续运行的,所以索引大小不能超过内存的限制。索引占用空间大小,可以通过db.collection.totalIndexSize()方法来查找了解。
3、查询限制
索引不能被以下的查询使用:
- 正则表达式及非操作符,如 $nin, $not, 等;
- 算术运算符,如 $mod, 等; $where 子句。
4、索引最大范围
- 集合中索引不能超过64个;
- 索引名的长度不能超过125个字符;
- 一个多值索引最多可以有31个字段;
- 如果现有的索引字段的值超过索引键的限制,MongoDB中不会创建索引。
5、不应该使用索引场景
- 使用索引是否合适,主要看查询操作的使用场景,预先进行模拟测试非常重要。
- 如果查询要返回的结果超过集合文档记录的三分之一,那么是否建立索引,需要慎重考虑;
- 对于以写为主的集合,建议慎用索引,默认情况下_id够用了。
小 结
- 注意BASE的特点,不能保证数据的高度准确性和可靠性,但是在这样的弱事务处理多文档记录的情况下,可以最大限度地保证数据的各种操作速度,速度响应是NOSQL的最优先考虑应用要求之一。
- 高级索引包括了子文档索引、数组文档索引、地理索引,要会建立,并会测试索引建立后的响应性能;另外,会判断索引建立的应用局限性。