use jasonisnthappy::Database;let db = Database::open("my.db")?;// Create non-unique index on age fielddb.create_index( "users", // collection name "age_idx", // index name "age", // field name false // unique: false)?;println!("Index created successfully");
Index names must be unique within a collection. Use descriptive names like field_idx or field_unique_idx.
Create indexes on multiple fields for multi-criteria queries.
// Index on city AND age (in that order)db.create_compound_index( "users", "city_age_idx", &["city", "age"], // field order matters! false)?;
Leftmost prefix rule
Field order
Unique compound
Compound indexes follow the leftmost prefix rule:
// Index: ["city", "age"]// ✅ Uses index: queries on "city" aloneusers.find("city is \"NYC\"")?;// ✅ Uses index: queries on "city" and "age"users.find("city is \"NYC\" and age > 25")?;// ❌ Cannot use index: queries on "age" aloneusers.find("age > 25")?;
The index can only be used if the query includes the leftmost field(s).
Choose field order based on query patterns:
// If you often query by city, then filter by age:db.create_compound_index("users", "idx1", &["city", "age"], false)?;// If you often query by age, then filter by city:db.create_compound_index("users", "idx2", &["age", "city"], false)?;// For different query patterns, create separate indexes
// Ensure combination of fields is uniquedb.create_compound_index( "reservations", "room_date_unique", &["room_id", "date"], true // unique combination)?;// Same room can't be reserved twice on the same date
// After creating index on "email"db.create_index("users", "email_idx", "email", false)?;let users = db.collection("users");// This query automatically uses the email indexlet results = users.find("email is \"alice@example.com\"")?;// Range queries also benefitlet results = users.find("email >= \"a\" and email < \"b\"")?;
// Create index on numeric fielddb.create_index("products", "price_idx", "price", false)?;let products = db.collection("products");// Fast range query using indexlet results = products.find("price >= 10.00 and price <= 50.00")?;
If your query only needs indexed fields, use projection:
// Index on emaildb.create_index("users", "email_idx", "email", false)?;// Query that only returns indexed fieldlet results = users.query() .filter("email >= \"a\" and email < \"b\"") .project(&["email"]) // Only indexed field .execute()?;
// Good index names (descriptive and unique)db.create_index("users", "email_unique_idx", "email", true)?;db.create_index("users", "created_at_idx", "created_at", false)?;db.create_compound_index("orders", "customer_date_idx", &["customer_id", "created_at"], false)?;// Bad index names (vague, not descriptive)db.create_index("users", "idx1", "email", true)?; // What does idx1 mean?db.create_index("users", "index", "age", false)?; // Too generic