| name | cursor-plugin-convex-rule-query-optimization |
| description | Use indexes instead of filter() for efficient database queries |
| metadata | {"version":"0.1.0"} |
Query Optimization
Avoid using .filter() on database queries. Instead, use indexed queries with .withIndex() or filter in TypeScript after collecting results.
Why
Using .filter() on queries performs a full table scan, which becomes slow as your data grows. Indexes provide fast lookups.
Examples
Bad:
const user = await ctx.db
.query("users")
.filter(q => q.eq(q.field("email"), email))
.first();
Good:
export default defineSchema({
users: defineTable({
email: v.string(),
name: v.string(),
}).index("by_email", ["email"]),
});
const user = await ctx.db
.query("users")
.withIndex("by_email", q => q.eq("email", email))
.first();
For Small Result Sets
If you must filter by a field that doesn't warrant an index:
const allUsers = await ctx.db.query("users").collect();
const filtered = allUsers.filter(user => user.age > 18);