Skip to content

feat: Database indexing optimization for financial queries (#128)#432

Open
lalalic wants to merge 1 commit intorohitdash08:mainfrom
lalalic:feat/db-indexing-optimization
Open

feat: Database indexing optimization for financial queries (#128)#432
lalalic wants to merge 1 commit intorohitdash08:mainfrom
lalalic:feat/db-indexing-optimization

Conversation

@lalalic
Copy link

@lalalic lalalic commented Mar 15, 2026

Summary

Implements comprehensive database indexing optimization for financial queries, addressing issue #128. Adds 20+ targeted indexes across all application tables with a performance monitoring API.

What it does

Index Strategy

Adds optimized indexes following the "equality → range → sort" principle for maximum query efficiency:

Expenses (highest volume):

  • idx_expenses_user_date — Primary listing (every page load)
  • idx_expenses_user_category_date — Category reports
  • idx_expenses_user_date_amount — Monthly totals and SUM queries
  • idx_expenses_notes_trgm — Full-text search (GIN trigram)
  • idx_expenses_user_type — Income vs expense filtering

Bills & Reminders:

  • idx_bills_user_due — Upcoming bills dashboard (partial: active only)
  • idx_reminders_pending — Cron job unsent reminders (partial)

All other tables — Categories, users, ad impressions, audit logs, subscriptions

Performance Monitoring

Method Endpoint Description
GET /admin/db/indexes List all indexes across tables
GET /admin/db/coverage Query pattern coverage analysis
GET /admin/db/statistics Table row counts
POST /admin/db/benchmark Run query benchmarks with timing

Files Changed

File Description
app/db/026_indexing_optimization.sql 20+ PostgreSQL index definitions with partial indexes and trigram
app/models.py SQLAlchemy model-level Index() declarations on 6 models
app/services/indexing.py Index verification, coverage analysis, benchmarks, statistics
app/routes/indexing.py Admin API endpoints
app/routes/__init__.py Blueprint registration
tests/conftest.py fakeredis test isolation
tests/test_indexing.py 27 comprehensive tests
docs/db-indexing-optimization.md Full documentation

Testing

27 passed in 0.74s
  • 6 model index definition verification tests
  • 3 index verification service tests
  • 5 prefix utility tests
  • 4 coverage analysis tests
  • 2 benchmark tests
  • 2 table statistics tests
  • 5 API endpoint tests (including auth)

Index Coverage Report Example

{
  "total_patterns": 9,
  "covered": 8,
  "missing": 1,
  "coverage_percentage": 88.9
}

Closes #128

…08#128)

Adds comprehensive indexing strategy across all tables with 20+ targeted
indexes to improve performance of high-frequency financial queries.

Key improvements:
- Expense queries: composite indexes for user+date, user+category+date,
  user+type, and trigram index for text search
- Bill queries: partial index for active upcoming bills
- Reminder queries: partial index for pending unsent reminders
- Category/user indexes for common lookup patterns
- Performance monitoring API with index coverage analysis,
  benchmarks, and table statistics

New files:
- app/db/026_indexing_optimization.sql - 20+ index definitions
- app/models.py - SQLAlchemy index declarations on all models
- app/services/indexing.py - coverage analysis, benchmarks, statistics
- app/routes/indexing.py - admin API endpoints
- docs/db-indexing-optimization.md - comprehensive documentation
- tests/test_indexing.py - 27 tests

API endpoints:
- GET /admin/db/indexes - list all indexes
- GET /admin/db/coverage - query pattern coverage report
- GET /admin/db/statistics - table row counts
- POST /admin/db/benchmark - run query benchmarks

27 tests covering index verification, coverage analysis, and API

Closes rohitdash08#128
@lalalic lalalic requested a review from rohitdash08 as a code owner March 15, 2026 11:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Database indexing optimization for financial queries

1 participant