Просмотр исходного кода

perf(backend): add 9 composite indexes via idempotent migration

Indexes: tasks(2), points_log, products, game_records, articles, users, growth_records, product_orders
Xiaogang Liao 2 месяцев назад
Родитель
Сommit
762f641b2f

+ 24 - 1
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -42,7 +42,8 @@ public class DatabaseInitializer implements CommandLineRunner {
             runMigrations();
             initializeDefaultData();
             initFoodTables();
-            recordSchemaVersion(1);
+            runIndexMigrations();
+            recordSchemaVersion(2);
             log.info("数据库初始化完成!");
         } else {
             log.info("数据库初始化已执行,跳过(schema_version >= 1)");
@@ -64,6 +65,28 @@ public class DatabaseInitializer implements CommandLineRunner {
         jdbcTemplate.update("INSERT INTO schema_version (version) VALUES (?)", version);
     }
 
+    private void runIndexMigrations() {
+        String[] ddl = {
+            "CREATE INDEX idx_tasks_family_category ON tasks(family_id, category)",
+            "CREATE INDEX idx_tasks_family_status ON tasks(family_id, status)",
+            "CREATE INDEX idx_points_log_family_created ON points_log(family_id, created_at)",
+            "CREATE INDEX idx_products_category_status ON products(category, status)",
+            "CREATE INDEX idx_game_records_user_date ON game_records(user_id, created_at)",
+            "CREATE INDEX idx_articles_status_published ON articles(status, published_at)",
+            "CREATE INDEX idx_users_phone ON users(phone)",
+            "CREATE INDEX idx_growth_records_child_date ON growth_records(child_id, record_date)",
+            "CREATE INDEX idx_product_orders_buyer ON product_orders(buyer_id, status)"
+        };
+        for (String sql : ddl) {
+            try {
+                jdbcTemplate.execute(sql);
+                log.info("Index created: {}", sql.split(" ON ")[0].replace("CREATE INDEX ", ""));
+            } catch (Exception e) {
+                log.debug("Index skipped (may already exist): {}", sql);
+            }
+        }
+    }
+
     private void initializeDatabase() {
         try {
             // 尝试连接数据库,如果不存在则创建