From 20b923f432a7a2b48d20c044347f0cc05fa025c2 Mon Sep 17 00:00:00 2001 From: cavidelizade Date: Fri, 17 Jul 2026 01:11:34 +0400 Subject: [PATCH] perf(api): index the module join tables module_issues, module_members and module_links had no indexes, so every lookup by module_id or issue_id was a sequential scan, while the cycle join tables already have the equivalent indexes. Add them in migration 000014. This covers the index half of #346. The N+1 association loading it also mentions is a larger refactor and is left for a follow-up. Refs #346 Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/api/migrations/000014_module_join_indexes.down.sql | 4 ++++ apps/api/migrations/000014_module_join_indexes.up.sql | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 apps/api/migrations/000014_module_join_indexes.down.sql create mode 100644 apps/api/migrations/000014_module_join_indexes.up.sql diff --git a/apps/api/migrations/000014_module_join_indexes.down.sql b/apps/api/migrations/000014_module_join_indexes.down.sql new file mode 100644 index 0000000..dfbde6b --- /dev/null +++ b/apps/api/migrations/000014_module_join_indexes.down.sql @@ -0,0 +1,4 @@ +DROP INDEX IF EXISTS idx_module_issues_module; +DROP INDEX IF EXISTS idx_module_issues_issue; +DROP INDEX IF EXISTS idx_module_members_module; +DROP INDEX IF EXISTS idx_module_links_module; diff --git a/apps/api/migrations/000014_module_join_indexes.up.sql b/apps/api/migrations/000014_module_join_indexes.up.sql new file mode 100644 index 0000000..2ae32a8 --- /dev/null +++ b/apps/api/migrations/000014_module_join_indexes.up.sql @@ -0,0 +1,8 @@ +-- The module join tables had no indexes, so every lookup by module_id or +-- issue_id did a sequential scan (ListModuleIssueIDs, RemoveModuleIssue, +-- CountIssuesByModuleIDs, ListMemberIDsByModuleIDs, the progress join, etc.). +-- The cycle join tables already have the equivalent indexes; add them here. +CREATE INDEX IF NOT EXISTS idx_module_issues_module ON module_issues (module_id); +CREATE INDEX IF NOT EXISTS idx_module_issues_issue ON module_issues (issue_id); +CREATE INDEX IF NOT EXISTS idx_module_members_module ON module_members (module_id); +CREATE INDEX IF NOT EXISTS idx_module_links_module ON module_links (module_id);