Indexing & query optimization

of 31 /31
Indexing & Query Optimization Jared Rosoff ([email protected] )

Embed Size (px)

description

My slides from MongoATL (2-8-2011)

Transcript of Indexing & query optimization

  • 1. Indexing & Query Optimization
    • Jared Rosoff ( [email_address] )

2. Overview

  • Indexing 101
  • Profiling your queries
  • Creating Indexes
  • Managing Index

3. Indexing 101 4. Ack! My queries are slow! http://michaelprescott.typepad.com/.a/6a00d83451574c69e20134858a87a2970c-800wi 5. Index FTW! http://musformation.com/pics/excited.jpg 6. Why did that happen? Magic More Magic 7. Table scans 1 2 3 4 5 6 7 Looked at 7 objects Find where x equals 7 8. Tree Lookup 7 6 5 4 3 2 1 Looked at 3 objects Find where x equals 7 9. O(n) vs. O(log n) Table scan Index Number of records Number of comparisons 10. Analyzing Query Performance 11. Using the Profiler

  • db.setProfilingLevel( level )
    • 0 == off
    • 1 == slow operations (>100ms)
    • 2 == all operations

12. Profiler Output

  • db.system.profile.find ({millis:{$gt:5}});
  • {
  • "ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" ,
  • "info" : "query test.foo ntoreturn:0 exceptionbytes:53" ,
  • "millis" : 88
  • }

13. Use explain

  • query = db.coll.find({title:My blog})
  • query.explain();

{ "cursor" : " BasicCursor ", "indexBounds" : [ ], "nscanned" : 57594, "nscannedObjects" : 57594, "n" : 3, "millis" : 108 } 14. Creating Indexes 15. Index a field

  • db.posts.ensureIndex( { name: 1 })
  • 1 = ascending
  • -1 = descending

16. Compound indexes

  • db.posts.ensureIndex({name: 1, date: -1})

17. Unique Indexes

  • db.posts.ensureIndex({title: 1}, {unique: true})

18. Embedded documents

  • db.posts.save({
  • title: My First blog,
  • comments: [
  • {author: James, ts : new Date()} ]
  • });
  • db.posts.ensureIndex({ comments.author : 1})

19. Multikeys

  • { tags : [ mongodb , cool ], ...}
  • db.posts.ensureIndex({ tags : 1})

20. Covered Indexes

  • New in 1.7.4
  • Query can be resolved in index only
  • Need to exclude _id from items projected

db.posts.ensureIndex({title: 1}) db.posts.find({title: My blog post:}, {title: 1, _id:0})) 21. Sparse Indexes 22. Geospatial Indexes 23. Managing Indexes 24. Listing indexes db.posts.getIndexes() 25. Dropping indexes db.posts.dropIndex({tags: 1}) 26. Background building db.posts.ensureIndex(..., {background: true}) 27. Query Planning 28. Query Planning 29. When isnt an index used? 30. Picking an Index scan Index on x Index on y Remember Terminate 31. Review

  • Understand your workload
    • Profile your queries
    • Use explain on the slow ones
  • Create indexes for slow operations