Try   HackMD

MongoDB Performance
ch2 MongoDB Indexes

tags: MongoDB University M201

Introduction to Indexes

index 最佳建立順序

精確匹配 > 排序條件 > 範圍匹配
equality before range
equality before sorting

  • Indexes is try to solve slow queries
  • b-tree data structure
  • Indexes increase the speed of read but decrease write, update and delete performance

Single Field Indexes

  • Simplest indexes in MongoDB
  • db.<collection>.createIndex({<field>: <direction>})
  • Key features
    • Keys from only one field
    • Can find a single value for the indexed field
    • Can find a range of values
    • Can use dot notation to index field in subdocuments
    • Can be used to find several distinct values in a single query

We should never index on the field that point to sub document, becuase doing so we'd have to query on the entire subdocument.

Sorting with Indexes

Method for sorting

  • In memory
  • using an index

When sorting with a single field index, sort either ascending or descending regardless of the pyhsical ordering of the index keys

Querying on Compound Indexes

  • index on two or more fields
  • There can be no more than 32 fields in a compound index

Index Prefix

Multikey Indexes

  • Index on a field that is an array, cuz for each entry in array the server will create a seperate index key.
  • Multikey indexes can be constructed over arrays that hold both scalar values (e.g. strings, numbers) and nested documents

Partial Indexes

only index the documents in a collection that meet a specified filter expression. By indexing a subset of the documents in a collection, partial indexes have lower storage requirements and reduced performance costs for index creation and maintenance.

// partial index example db.restaurants.createIndex( { cuisine: 1, name: 1 }, { partialFilterExpression: { rating: { $gt: 5 } } } )

Sparse Indexes

Sparse indexes only contain entries for documents that have the indexed field, even if the index field contains a null value

db.addresses.createIndex( { "xmpp_id": 1 }, { sparse: true } ) // partial index can cover sparse index db.addresses.createIndex( { "xmpp_id": 1 }, { "xmpp_id": { $exists: true } } )

Text Indexes

A collection can have at most one text index.

  • To create text index
db.<collection>.createIndex( { <field>: "text" } )
  • Query
db.<collection>.find({$text: {$search: "<keyword>"})
  • Create index keys for each word of string in field
    • e.g "MongoDB long sleeve T-shirt"
      • mongodb
      • long
      • sleeve
      • t
      • shirt
  • Case insensitive

Collation

Collation allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks.

{ locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int> numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }