Specialized Indexes

Back

Loading concept...

🔍 Specialized Indexes in NoSQL: Your Library’s Super-Powered Filing System

The Story: Welcome to the Magical Library

Imagine you run a giant library with millions of books. Regular shelves (normal indexes) work great for finding books by title or author. But what if someone asks:

  • “Find all books that mention ‘dragons’!” 📚🐉
  • “Which libraries are near my house?” 📍
  • “Remove newspapers older than 30 days!” 🗑️

You need special filing cabinets for these jobs. That’s exactly what Specialized Indexes do in NoSQL databases like MongoDB!


📖 What You’ll Learn

graph TD A["Specialized Indexes"] --> B["Text Index"] A --> C["Geospatial Index"] A --> D["TTL Index"] A --> E["Sparse Index"] A --> F["Index Selection"] A --> G["Covered Queries"] style A fill:#667eea,color:#fff style B fill:#4ECDC4,color:#fff style C fill:#FF6B6B,color:#fff style D fill:#95E1D3,color:#333 style E fill:#F38181,color:#fff style F fill:#AA96DA,color:#fff style G fill:#FCBAD3,color:#333

1️⃣ Text Index: The Word Detective 🔎

What Is It?

A Text Index is like having a super-smart librarian who reads EVERY word in EVERY book and remembers where each word appears.

The Analogy

Think of a search box on Google. You type “best pizza recipe” and it finds pages with those words. A Text Index does the same for your database!

Simple Example

Imagine you have articles:

// Your articles collection
{ title: "Learn MongoDB Fast",
  content: "MongoDB is a NoSQL database" }

{ title: "SQL vs NoSQL",
  content: "NoSQL databases are flexible" }

Create a Text Index:

db.articles.createIndex(
  { title: "text", content: "text" }
)

Now search for “NoSQL”:

db.articles.find(
  { $text: { $search: "NoSQL" } }
)

Result: Both articles appear because they contain “NoSQL”!

🎯 Key Points

Feature What It Does
$search Finds documents with words
$language Supports 20+ languages
$caseSensitive Match exact case

Why It’s Awesome

  • Searches inside text fields
  • Handles stemming (“running” matches “run”)
  • Ignores common words like “the”, “is”, “a”

2️⃣ Geospatial Index: The Map Finder 🗺️

What Is It?

A Geospatial Index helps find things based on location. Like asking “What restaurants are within 1 mile of me?”

The Analogy

Imagine you’re playing Pokémon GO. The game finds Pokémon near you using your GPS location. That’s geospatial indexing!

Simple Example

Store locations with coordinates:

// Restaurants collection
{
  name: "Pizza Palace",
  location: {
    type: "Point",
    coordinates: [-73.97, 40.77]
  }
}

Create a 2dsphere Index:

db.restaurants.createIndex(
  { location: "2dsphere" }
)

Find restaurants near you:

db.restaurants.find({
  location: {
    $near: {
      $geometry: {
        type: "Point",
        coordinates: [-73.96, 40.78]
      },
      $maxDistance: 1000  // meters
    }
  }
})

🎯 Two Types of Geo Indexes

graph TD A["Geospatial Indexes"] --> B["2dsphere"] A --> C["2d"] B --> D[Earth's curved surface] B --> E["Real-world maps"] C --> F["Flat surfaces"] C --> G["Game boards, floor plans"] style A fill:#FF6B6B,color:#fff style B fill:#4ECDC4,color:#fff style C fill:#95E1D3,color:#333
Type Best For Example
2dsphere Real Earth locations Delivery apps
2d Flat coordinate systems Game maps

3️⃣ TTL Index: The Auto-Cleaner 🧹

What Is It?

TTL stands for Time To Live. It’s an index that automatically deletes old documents after a set time.

The Analogy

Think of Snapchat stories that disappear after 24 hours. TTL Index is your database’s auto-delete feature!

Simple Example

Store user sessions:

// Sessions collection
{
  userId: "user123",
  token: "abc123",
  createdAt: new Date()
}

Create TTL Index (expire after 1 hour):

db.sessions.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 3600 }
)

Result: Documents automatically delete 1 hour after createdAt!

🎯 Perfect Use Cases

Use Case TTL Setting
Session tokens 1-24 hours
Verification codes 10-30 minutes
Temporary logs 7-30 days
Cache data Hours to days

⚠️ Important Rules

  1. TTL field must be a Date type
  2. MongoDB checks every 60 seconds
  3. Cannot use TTL on capped collections

4️⃣ Sparse Index: The Picky Organizer 🎯

What Is It?

A Sparse Index only indexes documents that have the indexed field. It skips documents where the field is missing or null.

The Analogy

Imagine organizing photos by “vacation location.” A sparse index only catalogs photos tagged with a location - it ignores untagged photos.

Simple Example

User profiles with optional email:

// Users - some have email, some don't
{ name: "Alice", email: "alice@mail.com" }
{ name: "Bob" }  // No email field!
{ name: "Charlie", email: null }

Create a Sparse Index:

db.users.createIndex(
  { email: 1 },
  { sparse: true }
)

Regular vs Sparse Index

graph TD A["3 Users"] --> B["Regular Index"] A --> C["Sparse Index"] B --> D["Indexes ALL 3 docs"] C --> E[Only Alice's doc] style A fill:#667eea,color:#fff style B fill:#F38181,color:#fff style C fill:#4ECDC4,color:#fff

🎯 When to Use Sparse

Scenario Use Sparse?
Optional fields ✅ Yes
Rare field values ✅ Yes
All docs have field ❌ No
Need to find nulls ❌ No

⚠️ Gotcha!

Sparse indexes may not be used if your query could return documents without the field!


5️⃣ Index Selection: Let MongoDB Choose 🤖

What Is It?

When you have multiple indexes, MongoDB’s query planner picks the best one for each query.

The Analogy

Like Google Maps choosing the fastest route. It tests different paths and picks the winner!

How MongoDB Chooses

graph TD A["Query Arrives"] --> B["Find Candidate Indexes"] B --> C["Create Competing Plans"] C --> D["Race! First to 101 results wins"] D --> E["Cache Winning Plan"] E --> F["Use for Similar Queries"] style A fill:#667eea,color:#fff style D fill:#FF6B6B,color:#fff style E fill:#4ECDC4,color:#fff

See Which Index Was Used

db.users.find({ age: 25 })
  .explain("executionStats")

Key fields to check:

// Look for these in output:
{
  "winningPlan": {
    "stage": "IXSCAN",  // Used index!
    "indexName": "age_1"
  },
  "executionStats": {
    "totalDocsExamined": 50,
    "totalKeysExamined": 50
  }
}

🎯 Force a Specific Index

db.users.find({ age: 25 })
  .hint({ age: 1 })  // Force age index

Index Selection Tips

Tip Why
Create indexes for common queries Faster lookups
Remove unused indexes Save storage
Use compound indexes wisely Cover multiple fields

6️⃣ Covered Queries: The Speed Champion 🏆

What Is It?

A Covered Query is answered entirely from the index - MongoDB never reads the actual documents!

The Analogy

Like reading book titles on library spines instead of opening each book. Super fast!

The Magic Formula

Query fields ⊆ Index fields
+
Projection fields ⊆ Index fields
= COVERED QUERY! 🎉

Simple Example

Create an index:

db.users.createIndex(
  { email: 1, name: 1 }
)

This query is COVERED:

db.users.find(
  { email: "test@mail.com" },
  { email: 1, name: 1, _id: 0 }
)

✅ Why? Query uses email, returns email + name, excludes _id - all in index!

This query is NOT covered:

db.users.find(
  { email: "test@mail.com" },
  { email: 1, name: 1, age: 1 }
)

❌ Why? age is not in the index!

🎯 Covered Query Checklist

graph TD A["Is Query Covered?"] --> B{Query fields in index?} B -->|Yes| C{Projection fields in index?} B -->|No| D["NOT Covered ❌"] C -->|Yes| E{_id excluded?} C -->|No| D E -->|Yes| F["COVERED! ✅"] E -->|No| G["Include _id in index"] style F fill:#4ECDC4,color:#fff style D fill:#FF6B6B,color:#fff

Verify with Explain

db.users.find(
  { email: "test@mail.com" },
  { email: 1, name: 1, _id: 0 }
).explain()

Look for: "totalDocsExamined": 0 - means NO documents read!


🎯 Quick Summary Table

Index Type Purpose Key Use Case
Text Search words in text Blog search, product search
Geospatial Location queries Maps, delivery apps
TTL Auto-delete old docs Sessions, temp data
Sparse Skip missing fields Optional fields
Index Selection Auto-pick best index Query optimization
Covered Queries Answer from index only Maximum speed

🚀 You Did It!

You now understand the super powers of NoSQL specialized indexes:

  1. 🔎 Text Index - Search inside text like Google
  2. 🗺️ Geospatial - Find things by location
  3. 🧹 TTL - Auto-clean old data
  4. 🎯 Sparse - Index only what exists
  5. 🤖 Index Selection - Let MongoDB choose wisely
  6. 🏆 Covered Queries - Lightning-fast index-only answers

Remember: Indexes are like hiring specialists for your library. Each type solves a specific problem. Use them wisely, and your database will fly! 🚀

Loading story...

Story - Premium Content

Please sign in to view this story and start learning.

Upgrade to Premium to unlock full access to all stories.

Stay Tuned!

Story is coming soon.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.