diff --git a/backend/cmd/api/main.go b/backend/cmd/api/main.go index 4a25fe2..99c1053 100644 --- a/backend/cmd/api/main.go +++ b/backend/cmd/api/main.go @@ -47,7 +47,7 @@ func main() { }() var deps router.Dependencies - db, err := database.OpenMySQL(cfg.MySQLDSN) + db, err := database.OpenMySQL(cfg.MySQLDSN, cfg.Log.Level) if err != nil { logger.Warn("mysql unavailable; database-backed APIs will return 503", zap.Error(err)) } else { diff --git a/backend/internal/database/mysql.go b/backend/internal/database/mysql.go index 7aa94c6..966e461 100644 --- a/backend/internal/database/mysql.go +++ b/backend/internal/database/mysql.go @@ -1,14 +1,20 @@ package database import ( + "log" + "os" + "strings" "time" "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/logger" ) -func OpenMySQL(dsn string) (*gorm.DB, error) { - db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) +func OpenMySQL(dsn string, logLevel string) (*gorm.DB, error) { + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ + Logger: newGormLogger(logLevel), + }) if err != nil { return nil, err } @@ -25,3 +31,19 @@ func OpenMySQL(dsn string) (*gorm.DB, error) { return db, nil } + +func newGormLogger(logLevel string) logger.Interface { + level := logger.Warn + if strings.EqualFold(strings.TrimSpace(logLevel), "debug") { + level = logger.Info + } + return logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), + logger.Config{ + SlowThreshold: 500 * time.Millisecond, + LogLevel: level, + IgnoreRecordNotFoundError: true, + Colorful: false, + }, + ) +} diff --git a/backend/migrations/000002_finance_query_indexes.sql b/backend/migrations/000002_finance_query_indexes.sql new file mode 100644 index 0000000..3894e01 --- /dev/null +++ b/backend/migrations/000002_finance_query_indexes.sql @@ -0,0 +1,20 @@ +-- 为后台财务汇总、明细查询和退款统计补充复合索引。 +-- 该迁移按版本只执行一次;若手工执行,请先确认索引不存在。 + +ALTER TABLE rental_orders + ADD INDEX idx_rental_orders_settled_at_id (settled_at, id); + +ALTER TABLE rental_orders + ADD INDEX idx_rental_orders_created_at_id (created_at, id); + +ALTER TABLE order_checkouts + ADD INDEX idx_order_checkouts_status_order_id_id (status, order_id, id); + +ALTER TABLE payment_orders + ADD INDEX idx_payment_orders_order_biz_status (order_id, biz_type, status); + +ALTER TABLE payment_orders + ADD INDEX idx_payment_orders_created_biz_status (created_at, biz_type, status); + +ALTER TABLE wallet_ledger + ADD INDEX idx_wallet_ledger_order_direction_biz (order_id, direction, biz_type);