ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Go MySQL 优化:database/sql 与 GORM 全攻略

Go MySQL 优化:database/sql 与 GORM 全攻略 Go MySQL 优化database/sql 与 GORM 全攻略MySQL 是 OLTP 业务的标准组件本文从连接池、预处理、事务到 ORM 选型讲透 Go 后端实战要点。一、数据库连接池db,err:sql.Open(mysql,user:pwdtcp(localhost:3306)/shop?charsetutf8mb4)db.SetMaxOpenConns(50)db.SetMaxIdleConns(20)db.SetConnMaxLifetime(30*time.Minute)db.SetConnMaxIdleTime(5*time.Minute)PoolSize CPU × 4 或更高。SetMaxIdleConns别设太大否则连接空占资源。二、CRUD 模板row:db.QueryRowContext(ctx,SELECT id, name FROM users WHERE id ?,id)varu User err:row.Scan(u.ID,u.Name)事务tx,err:db.BeginTx(ctx,nil)defertx.Rollback()_,errtx.ExecContext(ctx,UPDATE ...)errtx.Commit()三、预处理与 preparestmt,err:db.PrepareContext(ctx,INSERT INTO orders(id, user_id) VALUES (?, ?))deferstmt.Close()for_,o:rangeorders{_,errstmt.ExecContext(ctx,o.ID,o.UserID)}prepare 让 MySQL 复用解析计划性能提升明显。四、连接池泄漏排查现象随着时间推移db.Stats().InUse上升排查goroutine 卡在db.Query*没及时 Close Rows忘记defer rows.Close()context cancel 时未释放监控typeDbStatsstruct{OpenConnectionsintInUseintIdleint}prometheus.NewGaugeFunc(prometheus.GaugeOpts{Name:db_open,Help:DB},func()float64{s:db.Stats()returnfloat64(s.OpenConnections)})五、GORM 实战importgorm.io/gormimportgorm.io/driver/mysqldb,_:gorm.Open(mysql.Open(dsn),gorm.Config{})db.AutoMigrate(User{})u:User{Name:tom,Age:18}db.Create(u)varout User db.First(out,name ?,tom)db.Model(u).Update(Age,19)GORM 优势自动迁移Hook / Scopes软删除预加载劣势性能比 raw SQL 低 10-30%复杂查询可读性下降六、sqlx性能与灵活的均衡之选importgithub.com/jmoiron/sqlxdb,_:sqlx.Connect(mysql,dsn)db.Select(users,SELECT * FROM users WHERE age ?,18)sqlx 提供 StructScan、MapScan、NamedExec与 sql 标准 API 兼容零反射优化极少性能仍比不上手写 SQL但比 GORM 强。七、慢 SQL 排查importgithub.com/go-sql-driver/mysqlmysql.RegisterDriver(mysql,mysql.MySQLDriver{Slow:time.Second,Logger:log.New(...),})或者直接用 middleware 包importgithub.com/mattn/go-sqlite3// 不推荐仅示意生产推荐 prometheus trace将每一句 SQL 都打点。八、生产规范所有 SQL 走 prepare所有 query 带 ctx所有 Rows 及时 Close所有事务都有 Rollback defer所有表带 id BIGINT auto_increment created_at updated_at强文本字段必须 utf8mb4九、踩坑清单null 处理GORM 默认零值 null加 NOT NULLtime.Time 时区用 UTC 存查询显式带 zone不要用 GORM 复杂聚合老老实实 raw SQL数据库驱动版本与 Server 版本对齐十、总结与展望database/sql 标准库 驱动 简单 ORM 是 95% 项目的最佳路径。GORM 是快速开发之选sqlx 是性能与生产力平衡之选。未来基于 driver 类型的编译期 SQL 检查工具有待发展类似 sqlc 工具持续看好。十一、参考文献database/sql 文档GORM 官方文档https://gorm.io/sqlc 工具https://github.com/sqlc-dev/sqlc
返回列表