Mangodb学习–索引



文章目录

  • Mangodb学习--索引
  • 一、创建索引
  • 二、索引类型详解
  • 1.单键索引
  • 2.复合索引
  • 3.多键索引
  • 4.地理空间索引
  • 5.全文索引
  • 6.通配符索引
  • 三、感谢



一、创建索引

db.collection.createIndex(keys,options)

db2 建立索引 db创建索引_db2 建立索引


示例:

// 创建索引
db.books.createIndex({title:1})
// 查询索引
db.books.getIndexs()
// 查看索引占用的空间
db.books.totalIndexSize(is_detail)
// 删除索引
db.books.dropIndex("索引名称")
db.books.dropIndexes()

db2 建立索引 db创建索引_数据结构_02

二、索引类型详解

1.单键索引

什么是单键索引?—在某一个特定字段上建立索引。

db2 建立索引 db创建索引_学习_03


如图:在score上面建立索引为升序,当我们查找socre:30的数据,会直接命中索引,由于mangodb的数据结构是B-tree中的B+tree,会根据索引出来的数据回表查询这条数据的详细数据(未出现覆盖索引的情况下)。示例:

db2 建立索引 db创建索引_数据结构_04

2.复合索引

db2 建立索引 db创建索引_数据_05


如图所创建的索引,其先根据userid升序,当userid数据相同时,再根据score降序创建索引。需要注意的是mangodb的复合索引和mysql复合索引一样,满足最左匹配原则。示例:

db2 建立索引 db创建索引_数据结构_06

3.多键索引

什么是多建索引?—是针对数组的索引,在某个数组属性上建立索引。

db2 建立索引 db创建索引_数据结构_07


如图所示:在addr数组的zip属性上建立升序索引。示例:

db2 建立索引 db创建索引_数据库_08


db2 建立索引 db创建索引_数据结构_09


多建索引也可以出现在复合索引中,图中的item是单个属性,ratings数组。

**注意:Mangodb中不支持一个复合索引中出现多个多键索引。

示例:也可以在包含嵌套对象的数组字段上创建多键索引
db.inventory.createIndex({"stock.size":1,"stock.quantity":1})

db2 建立索引 db创建索引_db2 建立索引_10

4.地理空间索引

db2 建立索引 db创建索引_学习_11


location:"2dsphere"是固定的用法,表示对location属性做地理空间索引

db2 建立索引 db创建索引_数据_12


这个地理空间索引用redis也可以实现,貌似redis用的更多一些。

5.全文索引

db2 建立索引 db创建索引_数据库_13

示例:

db2 建立索引 db创建索引_数据结构_14


db2 建立索引 db创建索引_数据库_15


一般来说,做全文检索还得用Es,一般不用mango做的(主要在CN,mango的全文检索居然不支持中文,所以基本上用的都是Es)。

6.通配符索引

db2 建立索引 db创建索引_学习_16


示例:

db2 建立索引 db创建索引_数据结构_17


db2 建立索引 db创建索引_db2 建立索引_18


**注意:通配符索引不支持复合索引。

注意:通配符索引是稀疏索引,其不会查询空字段。因此通配符索引不支持查询字段不存在的文档。比如上面的数据,如果第二条数据的product_arrributes这个属性不存在的话,那么其对product_arrributes的通配符索引查询将直接跳过第二条数据。

db2 建立索引 db创建索引_db2 建立索引_19


也就是说,其查询空文档或者数组的时候是不会走你定义的通配符索引的哦

三、感谢

本人学习博客参考B站博主:只想摸鱼的程序员,感谢您的教学。