SlideShare a Scribd company logo
Indexing,Query Optimization, the Query
                         Optimizer

                                  Richard M Kreuter
                                       10gen Inc.
                                  richard@10gen.com


                                       July 27, 2010




MongoDB – Indexing and Query Optimiz(ation—er)
Indexing Basics




         Indexes are tree-structured sets of references to your
         documents.
         The query planner can employ indexes to efficiently enumerate
         and sort matching documents.




   MongoDB – Indexing and Query Optimiz(ation—er)
However, indexing strikes people as a gray art




         As is the case with relational systems, schema design and
         indexing go hand in hand...
         ... but you also need to know about your actual (not just
         predicted) query patterns.




   MongoDB – Indexing and Query Optimiz(ation—er)
Some indexing generalities




         A collection may have at most 64 indexes.
         A query may only use 1 index (at present).
         Indexes entail additional work on inserts, updates, deletes.




   MongoDB – Indexing and Query Optimiz(ation—er)
Creating Indexes
   The id attribute is always indexed. Additional indexes can be
   created with ensureIndex():

      // Create an index on the user attribute
      db.collection.ensureIndex({ user : 1 })
      // Create a compound index on
      // the user and email attributes
      db.collection.ensureIndex({ user : 1, email : 1 })
      // Create an index on the favorites
      // attribute, will index all values in list
      db.collection.ensureIndex({ favorites : 1 })
      // Create a unique index on the user attribte
      db.collection.ensureIndex({user:1}, {unique:true})
      // Create an index in the background.
      db.collection.ensureIndex({user:1}, {background:true})

   MongoDB – Indexing and Query Optimiz(ation—er)
Index maintenance




   // Drops an index on x
   db.collection.dropIndex({x:1})
   // drops all indexes
   db.collection.dropIndexes()
   // Rebuild indexes (need for this will go away in 1.6)
   db.collection.reIndex()




   MongoDB – Indexing and Query Optimiz(ation—er)
Indexes are smart about data types and structures




         Indexes on attributes whose values are of different types in
         different documents can speed up queries by skipping
         documents where the relevant attribute isn’t of the
         appropriate type.
         Indexes on attributes whose values are lists will index each
         element, speeding up queries that look into these attributes.
         (You really want to do this for querying on tags.)




   MongoDB – Indexing and Query Optimiz(ation—er)
When can indexes be used?


   In short, if you can envision how the index might get used, it
   probably is. These will all use an index on x:
         db.collection.find( { x:                   1 } )
         db.collection.find( { x :{ $in :                      [1,2,3] } } )
         db.collection.find( { x :                   { $gt :        1 } } )
         db.collection.find( { x :                   /^a/ } )
         db.collection.count( { x :                   2 } )
         db.collection.distinct( { x :                      2 } )
         db.collection.find().sort( { x :                      1 } )




   MongoDB – Indexing and Query Optimiz(ation—er)
Trickier cases where indexes can be used




         db.collection.find({ x : 1 }).sort({ y : 1 })
         will use an index on y for sorting, if there’s no index on x.
         (For this sort of case, use a compound index on both x and y
         in that order.)
         db.collection.update( { x : 2 } , { x : 3 } )
         will use an index on x (but older mongodb versions didn’t
         permit $inc and other modifiers on indexed fields.)




   MongoDB – Indexing and Query Optimiz(ation—er)
Some array examples



   The following queries will use an index on x, and will match
   documents whose x attribute is the arraay [2,10]
         db.collection.find({ x :                   2 })
         db.collection.find({ x :                   10 })
         db.collection.find({ x :                   { $gt :     5 } })
         db.collection.find({ x :                   [2,10] })
         db.collection.find({ x :                   { $in :     [2,5] }})




   MongoDB – Indexing and Query Optimiz(ation—er)
Geospatial indexes


   Geospatial indexes are a sort of special case; the operators that can
   take advantage of them can only be used if the relevant indexes
   have been created. Some examples:
         db.collection.find({ a : [50, 50]}) finds a
         document with this point for a.
         db.collection.find({a :                    {$near :   [50, 50]}})
         sorts results by distance.
         db.collection.find({
         a:{$within:{$box:[[40,40],[60,60]]}}}})
         db.collection.find({
         a:{$within:{$center:[[50,50],10]}}}})



   MongoDB – Indexing and Query Optimiz(ation—er)
When indexes cannot be used



         Many sorts of negations, e.g., $ne, $not.
         Tricky arithmetic, e.g., $mod.
         Most regular expressions (e.g., /a/).
         Expressions in $where clauses don’t take advantage of indexes.
         map/reduce can’t take advantage of indexes (mapping
         function is opaque to the query optimizer).
   As a rule, if you can’t imagine how an index might be used, it
   probably can’t!




   MongoDB – Indexing and Query Optimiz(ation—er)
Schema/index relationships

   Sometimes, question isn’t “given the shape of these documents,
   how do I index them?”, but “how might I shape the data so I can
   take advantage of indexing?”

   // Consider a schema that uses a list of
   // attribute/value pairs:
   db.c.insert({ product : "SuperDooHickey",
                 attribs : [ { stock : 50,
                               price : 29.95,
                               ... } ] });
   db.c.ensureIndex({ attribs : 1 });
   // All attribute queries can use one index.
   db.c.find( { attribs : { stock : { $gt : 0 } } } )


   MongoDB – Indexing and Query Optimiz(ation—er)
Index sizes



   Of course, indexes take up space. For many interesting databases,
   real query performance will depend on index sizes; so it’s useful to
   see these numbers.
         db.collection.stats() shows indexSizes, the size of
         each index in the collection.
         db.collection.totalIndexSize() displays the size of all
         indexes in the collection.




   MongoDB – Indexing and Query Optimiz(ation—er)
explain()

   It’s useful to be able to ensure that your query is doing what you
   want it to do. For this, we have explain(). Query plans that use
   an index have cursor type BtreeCursor.

   db.collection.find({x:{$gt:5}}).explain()
   {
   "cursor" : "BtreeCursor x_1",
           ...
   "nscanned" : 12345,
           ...
   "n" : 100,
   "millis" : 4,
           ...
   }


   MongoDB – Indexing and Query Optimiz(ation—er)
explain(), continued

   If the query plan doesn’t use the index, the cursor type will be
   BasicCursor.

   db.collection.find({x:{$gt:5}}).explain()
   {
   "cursor" : "BasicCursor",
          ...
   "nscanned" : 12345,
           ...
   "n" : 42,
   "millis" : 4,
           ...
   }


   MongoDB – Indexing and Query Optimiz(ation—er)
Query Optimizer




         MongoDB’s query optimizer is empirical, not cost-based.
         To test query plans, it tries several in parallel, and records the
         plan that finishes fastest.
         If a plan’s performance changes over time (e.g., as data
         changes), the database will reoptimize (i.e., retry all possible
         plans).




   MongoDB – Indexing and Query Optimiz(ation—er)
Hinting the query plan




   Sometimes, you might want to force the query plan. For this, we
   have hint().

   // Force the use of an                    index on attribute x:
   db.collection.find({x:                    1, ...}).hint({x:1})
   // Force indexes to be                    avoided!
   db.collection.find({x:                    1, ...}).hint({$natural:1})




   MongoDB – Indexing and Query Optimiz(ation—er)
Going forward



         www.mongodb.org — downloads, docs, community
         mongodb-user@googlegroups.com — mailing list
         #mongodb on irc.freenode.net
         try.mongodb.org — web-based shell
         10gen is hiring. Email jobs@10gen.com.
         10gen offers support, training, and advising services for
         mongodb




   MongoDB – Indexing and Query Optimiz(ation—er)

More Related Content

PDF
Indexing and Query Optimizer (Richard Kreuter)
PDF
Indexing and Query Optimizer
PDF
Mongophilly indexing-2011-04-26
PPTX
Indexing & Query Optimization
PPTX
Indexing and Query Optimization
PPTX
Reducing Development Time with MongoDB vs. SQL
PPTX
Indexing and Query Optimizer (Aaron Staple)
PPTX
Indexing In MongoDB
Indexing and Query Optimizer (Richard Kreuter)
Indexing and Query Optimizer
Mongophilly indexing-2011-04-26
Indexing & Query Optimization
Indexing and Query Optimization
Reducing Development Time with MongoDB vs. SQL
Indexing and Query Optimizer (Aaron Staple)
Indexing In MongoDB

What's hot (20)

PPTX
Indexing documents
PPTX
Apex collection patterns
PDF
Python dictionary : past, present, future
PDF
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
PPTX
MongoDB and Indexes - MUG Denver - 20160329
PDF
learn you some erlang - chap 9 to chap10
PDF
ORM in Django
KEY
Advanced Django ORM techniques
PDF
Encontra presentation
KEY
Django Pro ORM
PDF
PostgreSQL Modules Tutorial - chkpass, hstore, fuzzystrmach, isn
PDF
PDF
Big Data LDN 2017: From Zero to AI in 30 Minutes
PPTX
11. session 11 functions and objects
PPTX
Webinar: Indexing and Query Optimization
PPTX
1403 app dev series - session 5 - analytics
PDF
High Performance GPU computing with Ruby, Rubykaigi 2018
PPT
Spring data presentation
PDF
Java script objects 1
 
Indexing documents
Apex collection patterns
Python dictionary : past, present, future
Java/Scala Lab: Борис Трофимов - Обжигающая Big Data.
MongoDB and Indexes - MUG Denver - 20160329
learn you some erlang - chap 9 to chap10
ORM in Django
Advanced Django ORM techniques
Encontra presentation
Django Pro ORM
PostgreSQL Modules Tutorial - chkpass, hstore, fuzzystrmach, isn
Big Data LDN 2017: From Zero to AI in 30 Minutes
11. session 11 functions and objects
Webinar: Indexing and Query Optimization
1403 app dev series - session 5 - analytics
High Performance GPU computing with Ruby, Rubykaigi 2018
Spring data presentation
Java script objects 1
 
Ad

Similar to Mongoseattle indexing-2010-07-27 (20)

PDF
Indexing and Query Optimizer (Mongo Austin)
PPTX
Query Optimization in MongoDB
PDF
Nosql part 2
ODP
Mongo indexes
PPTX
Indexing with MongoDB
PPTX
MongoDB's index and query optimize
DOCX
unit 4,Indexes in database.docx
PDF
Mongo db a deep dive of mongodb indexes
PPTX
Indexing Strategies to Help You Scale
PDF
Indexing and Query Performance in MongoDB.pdf
PDF
Quick overview on mongo db
PPT
Fast querying indexing for performance (4)
PDF
Mongo db basics
PDF
Indexing and Performance Tuning
PPTX
MongoDB is a document database. It stores data in a type of JSON format calle...
PPTX
MongoDB - Indexing- Types iNDEXING.pptx
PPTX
Mongo DB Presentation
PPT
Indexing & query optimization
PPT
Mongo Performance Optimization Using Indexing
PPT
Mongo db tutorials
Indexing and Query Optimizer (Mongo Austin)
Query Optimization in MongoDB
Nosql part 2
Mongo indexes
Indexing with MongoDB
MongoDB's index and query optimize
unit 4,Indexes in database.docx
Mongo db a deep dive of mongodb indexes
Indexing Strategies to Help You Scale
Indexing and Query Performance in MongoDB.pdf
Quick overview on mongo db
Fast querying indexing for performance (4)
Mongo db basics
Indexing and Performance Tuning
MongoDB is a document database. It stores data in a type of JSON format calle...
MongoDB - Indexing- Types iNDEXING.pptx
Mongo DB Presentation
Indexing & query optimization
Mongo Performance Optimization Using Indexing
Mongo db tutorials
Ad

More from MongoDB (20)

PDF
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
PDF
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
PDF
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
PDF
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
PDF
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
PDF
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
PDF
MongoDB SoCal 2020: MongoDB Atlas Jump Start
PDF
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
PDF
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
PDF
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
PDF
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
PDF
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
PDF
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
PDF
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
PDF
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
PDF
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
PDF
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
PDF
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
PDF
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
PDF
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...

Mongoseattle indexing-2010-07-27

  • 1. Indexing,Query Optimization, the Query Optimizer Richard M Kreuter 10gen Inc. [email protected] July 27, 2010 MongoDB – Indexing and Query Optimiz(ation—er)
  • 2. Indexing Basics Indexes are tree-structured sets of references to your documents. The query planner can employ indexes to efficiently enumerate and sort matching documents. MongoDB – Indexing and Query Optimiz(ation—er)
  • 3. However, indexing strikes people as a gray art As is the case with relational systems, schema design and indexing go hand in hand... ... but you also need to know about your actual (not just predicted) query patterns. MongoDB – Indexing and Query Optimiz(ation—er)
  • 4. Some indexing generalities A collection may have at most 64 indexes. A query may only use 1 index (at present). Indexes entail additional work on inserts, updates, deletes. MongoDB – Indexing and Query Optimiz(ation—er)
  • 5. Creating Indexes The id attribute is always indexed. Additional indexes can be created with ensureIndex(): // Create an index on the user attribute db.collection.ensureIndex({ user : 1 }) // Create a compound index on // the user and email attributes db.collection.ensureIndex({ user : 1, email : 1 }) // Create an index on the favorites // attribute, will index all values in list db.collection.ensureIndex({ favorites : 1 }) // Create a unique index on the user attribte db.collection.ensureIndex({user:1}, {unique:true}) // Create an index in the background. db.collection.ensureIndex({user:1}, {background:true}) MongoDB – Indexing and Query Optimiz(ation—er)
  • 6. Index maintenance // Drops an index on x db.collection.dropIndex({x:1}) // drops all indexes db.collection.dropIndexes() // Rebuild indexes (need for this will go away in 1.6) db.collection.reIndex() MongoDB – Indexing and Query Optimiz(ation—er)
  • 7. Indexes are smart about data types and structures Indexes on attributes whose values are of different types in different documents can speed up queries by skipping documents where the relevant attribute isn’t of the appropriate type. Indexes on attributes whose values are lists will index each element, speeding up queries that look into these attributes. (You really want to do this for querying on tags.) MongoDB – Indexing and Query Optimiz(ation—er)
  • 8. When can indexes be used? In short, if you can envision how the index might get used, it probably is. These will all use an index on x: db.collection.find( { x: 1 } ) db.collection.find( { x :{ $in : [1,2,3] } } ) db.collection.find( { x : { $gt : 1 } } ) db.collection.find( { x : /^a/ } ) db.collection.count( { x : 2 } ) db.collection.distinct( { x : 2 } ) db.collection.find().sort( { x : 1 } ) MongoDB – Indexing and Query Optimiz(ation—er)
  • 9. Trickier cases where indexes can be used db.collection.find({ x : 1 }).sort({ y : 1 }) will use an index on y for sorting, if there’s no index on x. (For this sort of case, use a compound index on both x and y in that order.) db.collection.update( { x : 2 } , { x : 3 } ) will use an index on x (but older mongodb versions didn’t permit $inc and other modifiers on indexed fields.) MongoDB – Indexing and Query Optimiz(ation—er)
  • 10. Some array examples The following queries will use an index on x, and will match documents whose x attribute is the arraay [2,10] db.collection.find({ x : 2 }) db.collection.find({ x : 10 }) db.collection.find({ x : { $gt : 5 } }) db.collection.find({ x : [2,10] }) db.collection.find({ x : { $in : [2,5] }}) MongoDB – Indexing and Query Optimiz(ation—er)
  • 11. Geospatial indexes Geospatial indexes are a sort of special case; the operators that can take advantage of them can only be used if the relevant indexes have been created. Some examples: db.collection.find({ a : [50, 50]}) finds a document with this point for a. db.collection.find({a : {$near : [50, 50]}}) sorts results by distance. db.collection.find({ a:{$within:{$box:[[40,40],[60,60]]}}}}) db.collection.find({ a:{$within:{$center:[[50,50],10]}}}}) MongoDB – Indexing and Query Optimiz(ation—er)
  • 12. When indexes cannot be used Many sorts of negations, e.g., $ne, $not. Tricky arithmetic, e.g., $mod. Most regular expressions (e.g., /a/). Expressions in $where clauses don’t take advantage of indexes. map/reduce can’t take advantage of indexes (mapping function is opaque to the query optimizer). As a rule, if you can’t imagine how an index might be used, it probably can’t! MongoDB – Indexing and Query Optimiz(ation—er)
  • 13. Schema/index relationships Sometimes, question isn’t “given the shape of these documents, how do I index them?”, but “how might I shape the data so I can take advantage of indexing?” // Consider a schema that uses a list of // attribute/value pairs: db.c.insert({ product : "SuperDooHickey", attribs : [ { stock : 50, price : 29.95, ... } ] }); db.c.ensureIndex({ attribs : 1 }); // All attribute queries can use one index. db.c.find( { attribs : { stock : { $gt : 0 } } } ) MongoDB – Indexing and Query Optimiz(ation—er)
  • 14. Index sizes Of course, indexes take up space. For many interesting databases, real query performance will depend on index sizes; so it’s useful to see these numbers. db.collection.stats() shows indexSizes, the size of each index in the collection. db.collection.totalIndexSize() displays the size of all indexes in the collection. MongoDB – Indexing and Query Optimiz(ation—er)
  • 15. explain() It’s useful to be able to ensure that your query is doing what you want it to do. For this, we have explain(). Query plans that use an index have cursor type BtreeCursor. db.collection.find({x:{$gt:5}}).explain() { "cursor" : "BtreeCursor x_1", ... "nscanned" : 12345, ... "n" : 100, "millis" : 4, ... } MongoDB – Indexing and Query Optimiz(ation—er)
  • 16. explain(), continued If the query plan doesn’t use the index, the cursor type will be BasicCursor. db.collection.find({x:{$gt:5}}).explain() { "cursor" : "BasicCursor", ... "nscanned" : 12345, ... "n" : 42, "millis" : 4, ... } MongoDB – Indexing and Query Optimiz(ation—er)
  • 17. Query Optimizer MongoDB’s query optimizer is empirical, not cost-based. To test query plans, it tries several in parallel, and records the plan that finishes fastest. If a plan’s performance changes over time (e.g., as data changes), the database will reoptimize (i.e., retry all possible plans). MongoDB – Indexing and Query Optimiz(ation—er)
  • 18. Hinting the query plan Sometimes, you might want to force the query plan. For this, we have hint(). // Force the use of an index on attribute x: db.collection.find({x: 1, ...}).hint({x:1}) // Force indexes to be avoided! db.collection.find({x: 1, ...}).hint({$natural:1}) MongoDB – Indexing and Query Optimiz(ation—er)
  • 19. Going forward www.mongodb.org — downloads, docs, community [email protected] — mailing list #mongodb on irc.freenode.net try.mongodb.org — web-based shell 10gen is hiring. Email [email protected]. 10gen offers support, training, and advising services for mongodb MongoDB – Indexing and Query Optimiz(ation—er)