在文档数据库服务中,可以使用索引来加速查询操作。索引是一个数据结构,它可以在集合中对指定的字段进行排序,并为这些字段创建一个快速查找的数据结构。文档数据库服务支持多种类型的索引,例如单字段索引、多字段联合索引、全文索引等。
索引分类
-
单字段索引:单字段索引是最常见的索引类型,它基于集合中的单个字段进行排序和查找。
-
复合索引:复合索引是基于多个字段进行排序和查找的索引类型。复合索引可以包含多个字段,可以根据这些字段的顺序指定索引键的排序方式。
-
多键索引:在文档数据库服务中,一个文档可以包含多个值相同的数组或嵌套文档,这些值可以被视为多个键。多键索引可以基于这些多个键对文档进行排序和查找。下面是一个示例:
假设有一个集合 books,其中包含每本书的信息,其中一个字段 tags 是一个包含多个标签的数组。例如:{ "_id" : ObjectId("6146c03f6c9d8f5fb9da0e3c"), "title" : "The Great Gatsby", "author" : "F. Scott Fitzgerald", "tags" : [ "Fiction", "Classic", "Romance" ] }
为了加速对 tags 字段的查询操作,可以在 tags 字段上创建一个多键索引。例如:
db.books.createIndex({ tags: 1 })
这将在 tags 字段上创建一个升序的多键索引。
现在,可以使用以下查询来查找包含特定标签的书籍:
db.books.find({ tags: "Fiction" })
这个查询将使用 tags 字段上的多键索引来加速查询,返回所有包含 "Fiction" 标签的书籍。
需要注意的是,多键索引的效率可能受到数组字段中值的数量和类型的影响。如果数组字段中包含大量的值或嵌套文档,则多键索引可能不是最佳选择。在使用多键索引时,需要根据实际情况评估其效果和性能。
-
地理空间索引:地理空间索引是一种针对地理空间数据进行优化的索引类型,它可以加速针对地理空间数据的查询和聚合操作。可以使用 createIndex() 命令创建地理空间索引。
-
文本索引:文本索引是一种针对文本数据进行优化的索引类型,它可以加速全文检索操作。文本索引只能用于字符串字段。可以使用 createIndex() 命令创建文本索引。
-
散列索引:散列索引是一种基于哈希函数的索引类型,它可以加速散列键(如密码)的查找操作。可以使用 createIndex() 命令创建散列索引。
-
TTL 索引:TTL 索引是一种基于时间戳的索引类型,它可以自动删除满足一定时间条件的文档。可以使用 createIndex() 命令创建 TTL 索引。
索引名称
索引的默认名称是索引键和索引中每个键的方向(即1或-1)的连接,使用下划线作为分隔符。例如,在 { item : 1, quantity: -1 }上创建的索引名称为item1_quantity-1。
您可以创建具有自定义名称的索引,比如比默认名称更易于阅读的索引。例如,考虑一个经常查询products集合以填充现有库存数据的应用程序。下面的createIndex() 方法在名为查询的商品和数量上创建一个索引:
db.products.createIndex( { item: 1, quantity: -1 } , { name: "query for inventory" })
您可以使用 db.collection.getIndexes()方法查看索引名称。一旦创建索引,您将无法重命名。相反,您必须删除并使用新名称重新创建索引。
文档数据库服务提供了许多不同的索引类型来支持特定类型的数据和查询。
创建索引
在文档数据库服务中,可以使用 createIndex() 方法来创建索引。下面是创建索引的一般步骤:
- 连接到文档数据库服务的数据库。
- 选择要创建索引的集合。
- 使用 createIndex() 方法创建索引。createIndex() 方法接受两个参数:
- 索引键(Index Keys):一个包含一个或多个字段的文档,用于指定要在哪些字段上创建索引。可以使用对象字面量或字符串表示法指定索引键。
- 选项(Options):一个包含一个或多个选项的文档,用于指定索引的属性和行为。可以省略选项对象,使用默认值。
以下是一些常用的可选参数:- background:指定创建索引时是否在后台运行。如果设置为 true,则创建索引的过程将在后台运行,不会阻塞其他操作。默认值为 false。
- unique:指定索引是否唯一。如果设置为 true,则索引键值必须唯一。默认值为 false。
- sparse:指定索引是否稀疏。如果设置为 true,则只有包含索引键的文档才会被索引。默认值为 false。
- name:指定索引的名称。如果未指定名称,则文档数据库服务将自动生成一个唯一的索引名称。
- expireAfterSeconds:对于 TTL 索引而言,指定文档应在多长时间后过期(以秒为单位)。
- partialFilterExpression:指定一个筛选器表达式,该表达式将被应用于索引的文档子集。只有满足表达式的文档才会被包含在索引中。
- collation:指定索引应使用的排序规则。可以使用排序规则来控制大小写、重音符号和特定字符的排序方式。
- storageEngine:指定索引应使用的存储引擎。可以使用存储引擎来控制索引的存储方式和性能
例如,以下是在 users 集合中为 username 字段创建一个升序索引的示例:
db.users.createIndex({ username: 1 })
如果要在 users 集合中为 username 和 email 字段创建一个复合索引,可以使用以下代码:
db.users.createIndex({ username: 1, email: 1 })
需要留意的是,创建索引可能需要一些时间,具体时间取决于集合的大小和索引的复杂度。在创建索引时,可以使用 explain() 方法来查看查询计划和性能统计信息,以便评估索引的效果和性能。