Cursor Plugin Convex Rule Query Optimization

Use indexes instead of filter() for efficient database queries

KunanonJ 7fd8915 1.1 KB Updated

File contents

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:

// In schema.ts
export default defineSchema({
  users: defineTable({
    email: v.string(),
    name: v.string(),
  }).index("by_email", ["email"]),
});

// In your function
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);

KunanonJ/ai-skills-hub/tree/main/skills/cursor-plugin-convex-rule-query-optimization commit 7fd8915d04

Frequently asked questions

npx skillmds@latest add kunanonj/cursor-plugin-convex-rule-query-optimization