Mongodb复合索引

王柳  金牌会员 | 2024-7-19 22:38:33 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 999|帖子 999|积分 2997

学习mongodb,体会mongodb的每一个使用细节,接待阅读威赞的文章。这是威赞发布的第90篇mongodb技术文章,接待欣赏本专栏威赞发布的其他文章。假如您以为我的文章对您有资助大概解决您的问题,接待在文章下面点个赞,大概关注威赞。谢谢。
在mongodb中,为集合添加单字段索引,能够提高针对单个字段的查询效率。但对于针对多个字段的查询,要怎样提高查询效率呢?例如一个杂货店的老板,想要通过查询商品和剩余数量,来知道是否需要补货。这里我们联合官方文档,整理先容mongodb的另一个索引类型,复合索引。
定义

复合索引是使用集合当中文档两个或多个字段构成的索引。索引中收集和排序了用户指定的字段,按照用户指定的顺序,依次分组排序。
下图展示了一个复合索引的布局。用户使用userid正序和分数倒序建立的复合索引。在mongodb索引当中,先按照userid字母表顺序正序排列,然后在每一个userid下面,分数按照倒序来排列。

在通用的查询字段上添加索引,能够增长索引覆盖查询的机会。索引覆盖查询是只能够完全使用索引来执行的查询,不需要扫描文档数据来返回效果。
语法

  1. db.<collection>.createIndex( {
  2.   <field1>: <sortOrder>,
  3.   <field2>: <sortOrder>,
  4.   ……
  5.   <fieldN>: <sortOrder>,
  6. })
复制代码
限定



  • 单个复合索引,最多包含32个字段
  • 索引中字段排序影响复合索引的效率。复合索引中包含了依据用户定义的字段顺序所创建的文档引用。
  • 复合索引按照正序或倒序的顺序,生存指定字段值。而这种排序顺序,能够决定查询是否支持索引排序。
  • 复合索引可以包含一个哈希索引字段
复合索引前缀查询

索引前缀查询表现使用索引字段中的前面部分字段来举行的索引查询。mongodb的复合索引,支持这样的前缀查询。
考虑这样的索引
  1. {"item": 1, "location": 1, "stock": 1}
复制代码
该索引当中,包含两个索引前缀
  1. {"item": 1}
  2. {"item": 1, "location": 1}
复制代码
则该索引,能够支持下面的字段组合查询




    • item
    • item + location
    • item + location + stock

mongodb也可以使用这个索引支持item + stock这两个字段的查询。但只有item字段使用了这个索引,stock查询条件无法使用这个索引。因为构建索引时, stock字段跟随在location字段后。索引数据数据中,stock字段值排列在location字段的分组中。索引字段按照建立索引时字段顺序剖析。假如一个查询跳过了索引前缀,则无法使用索引。如上述索引,无法支持下面几个字段的查询




    • location
    • stock
    • location + stock

缺少了item字段,这些查询都无法使用该索引。
特别复合索引

复合索引能够包含不同类型的特别索引。索引类型的组合方式,能够决定索引匹配文档的方式。
下面的表格展示了包含不同特别索引的复合索引构建行为。
复合索引构成
复合索引行为
正序索引
倒序索引
为包含指定字段的文档建立索引
正序索引
倒序索引
地理位置索引
只能为包含地理位置的文档建立索引
正序索引
倒序索引
文本索引
只能为包含文档字段的文档建立索引
应用

构建集合students并插入数据
  1. db.students.insertMany([
  2.    {
  3.       "name": "Alice",
  4.       "gpa": 3.6,
  5.       "location": { city: "Sacramento", state: "California" }
  6.    },
  7.    {
  8.       "name": "Bob",
  9.       "gpa": 3.2,
  10.       "location": { city: "Albany", state: "New York" }
  11.    }
  12. ])
复制代码
为name字段和gpa字段添加复合索引。索引中按照name字段的正序排列,gpa字段的倒序排列
  1. db.students.createIndex({
  2.     name: 1,
  3.     gpa: -1
  4. })
复制代码
该索引能够支持针对name和gpa两个字段的查询,也能够支持name字段的查询,因为name字段是该索引的索引前缀。
  1. db.students.find({
  2.     name: 'Alice',
  3.     gpa: 3.6
  4. })
  5. db.students.find({
  6.     name: 'Bob'
  7. })
复制代码
该索引不支持仅包括gpa字段的查询,如
  1. db.students.find({ gpa: { $gt: 3.5}})
复制代码
因为gpa字段,没有在该索引的前缀当中。







免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表