WayrApp Backend & Ecosystem Documentation - v1.0.0
    Preparing search index...

    Class QueryOptimizer

    Database query optimization utility providing analysis and recommendations.

    Static utility class that analyzes Prisma database queries and provides specific optimization suggestions including N+1 query prevention, pagination improvements, and indexing recommendations. Helps developers identify and resolve common database performance issues before they impact production systems.

    // Analyze individual query for optimization opportunities
    const suggestions = QueryOptimizer.analyzeQuery('User', 'findMany', {
    skip: 1000,
    where: { email: 'user@example.com' }
    });
    suggestions.forEach(suggestion => console.log(`💡 ${suggestion}`));
    // Generate index suggestions from query patterns
    const queryLog = [
    { model: 'User', operation: 'findMany', args: { where: { email: 'test@example.com' } } },
    { model: 'Course', operation: 'findMany', args: { orderBy: { createdAt: 'desc' } } }
    ];
    const indexSuggestions = QueryOptimizer.suggestIndexes(queryLog);
    Index

    Methods

    • Analyzes a single database query and provides optimization suggestions.

      Examines query patterns to identify common performance issues such as missing includes (N+1 queries), inefficient pagination, and missing filters on large tables. Returns specific, actionable recommendations for improving query performance.

      Parameters

      • model: string

        Prisma model name being queried

      • operation: string

        Database operation (findMany, findFirst, etc.)

      • args: any

        Query arguments including where, include, skip, etc.

      Returns string[]

      Array of specific optimization suggestions

      // Analyze query with potential N+1 issue
      const suggestions = QueryOptimizer.analyzeQuery('User', 'findMany', {
      where: { isActive: true }
      });
      // Returns: ["Consider using 'include' to fetch related data in a single query for User.findMany"]
      // Analyze query with inefficient pagination
      const suggestions = QueryOptimizer.analyzeQuery('Course', 'findMany', {
      skip: 5000,
      take: 20
      });
      // Returns: ["Large offset (5000) detected. Consider cursor-based pagination for better performance."]
    • Analyzes query patterns and suggests database indexes for performance optimization.

      Examines a collection of database queries to identify frequently used fields in WHERE clauses and ORDER BY statements. Generates specific index recommendations based on usage frequency and query patterns to improve database performance.

      Parameters

      • queryLog: { model: string; operation: string; args: any }[]

        Array of executed queries with their parameters

      Returns string[]

      Array of specific database index recommendations

      // Analyze query patterns for index suggestions
      const queryLog = [
      { model: 'User', operation: 'findMany', args: { where: { email: 'user1@example.com' } } },
      { model: 'User', operation: 'findMany', args: { where: { email: 'user2@example.com' } } },
      { model: 'Course', operation: 'findMany', args: { orderBy: { createdAt: 'desc' } } },
      // ... more queries
      ];

      const suggestions = QueryOptimizer.suggestIndexes(queryLog);
      // Returns: ["Consider adding index on User.email (used 15 times)", "Consider adding index on Course.createdAt_sort (used 12 times)"]
      // Use with query logging middleware
      const queryLog = [];
      prisma.$use(async (params, next) => {
      queryLog.push({ model: params.model, operation: params.action, args: params.args });
      return next(params);
      });

      // Periodically analyze and suggest indexes
      setInterval(() => {
      const suggestions = QueryOptimizer.suggestIndexes(queryLog);
      suggestions.forEach(suggestion => logger.info(`Index suggestion: ${suggestion}`));
      }, 3600000); // Every hour