Frappe ERPNext Database Optimization: Best Practices for Composite Indexing in Custom Reports

:rocket: Reduced database query time from 8-9 minutes to ~1 minute in our Frappe ERPNext system.

Here’s how strategic composite indexing transformed our General Ledger report performance:

The Challenge:
Our custom General Ledger report was taking 8-9 minutes to load, impacting user productivity. With millions of GL Entry records, standard queries were doing full table scans.

The Solution:
We implemented composite indexes that match our query filter patterns, achieving an 88% performance improvement.

Key Optimization Techniques:

:white_check_mark: Composite Index Strategy

  • Created index matching exact query filter order
  • Index: (company, is_cancelled, posting_date, account, voucher_type, voucher_no)
  • WHERE clause conditions MUST match index column order

:white_check_mark: Query Optimization

  • Used index hints: USE INDEX (idx_gl_entry_report_query)
  • Implemented cursor-based pagination (better than OFFSET)
  • Batch fetching for related data (5,000 records per batch)

:white_check_mark: Code-Level Improvements

  • Filter order enforced to match index structure
  • Minimal field selection for better index coverage
  • Proper parameterized queries

Results:
:bar_chart: Query Time: 8-9 minutes → ~1 minute (88% improvement)
:bar_chart: Database Load: Significantly reduced full table scans
:bar_chart: User Experience: Reports now load in real-time

Best Practices for Frappe ERPNext Database Optimization:

  1. Analyze slow queries first (EXPLAIN, slow query log)
  2. Create composite indexes matching filter patterns
  3. Order index columns by selectivity (most selective first)
  4. Ensure WHERE clause order matches index column order
  5. Use cursor-based pagination for large datasets
  6. Implement batch processing for related data fetches
  7. Monitor index usage and remove unused indexes

:light_bulb: Key Takeaway: Strategic indexing isn’t just about adding indexes—it’s about understanding your query patterns and designing indexes that match them perfectly.

ERPNext mysql

3 Likes