🗄️ 数据库性能调优

04-07 | 分析调优数据库连接池中间件

📌 一句话概括

业界统计,80%的性能瓶颈最终定位在数据库层——SQL慢查询、索引缺失、连接池耗尽、锁竞争是银行系统最常见的四类数据库性能问题。数据库调优要从SQL→索引→连接池→实例参数逐层递进。

💡 数据库调优四层模型

第一层:SQL优化

先从慢查询日志入手,找到压测期间耗时最长的Top 10 SQL。常见的SQL问题:全表扫描(缺失索引)、隐式类型转换(导致索引失效)、大表JOIN未用小表驱动大表、SELECT *返回不必要字段。

第二层:索引优化

检查执行计划(EXPLAIN),确保关键SQL使用最优索引。银行系统的常见索引陷阱:联合索引列顺序错误(最左前缀原则)、函数索引缺失(WHERE DATE(create_time)=...)、索引过多导致写入变慢。

第三层:连接池配置

应用服务器的数据库连接池是并发能力的直接瓶颈。连接池太小→请求排队超时;连接池太大→数据库连接数耗尽。经验公式:连接池大小 = 最大并发线程数 × 单线程平均SQL执行时间。HikariCP/Druid的常用配置:maximumPoolSize=(CPU核心数×2)+磁盘数。

第四层:数据库实例参数

MySQL的InnoDB缓冲池(innodb_buffer_pool_size)应设为可用内存的70-80%。Oracle的SGA/PGA需根据连接数和SQL复杂度调整。银行核心系统的数据库参数需DBA联合性能测试团队共同确认。

🔍 测试实战

1. 慢查询实时监控

操作:压测期间开启数据库慢查询日志(long_query_time=0.5秒),同时用MySQL Exporter + Grafana监控QPS、连接数和慢查询趋势。

2. 连接池压力测试

操作:阶梯式增加并发数,观察连接池的使用率曲线。当连接池使用率达到80%且出现等待计数时,说明连接池即将成为瓶颈,需要扩容或优化SQL降低执行时间。

⚠️ 常见坑点

  1. 不看执行计划就加索引——有些SQL加索引后反而变慢(优化器选错索引),需用FORCE INDEX验证
  2. 连接池超配——应用扩容5倍但数据库最大连接数不变,导致新节点拿不到连接
  3. 忽略锁竞争——高并发UPDATE同一行(如账户余额)时,行锁等待成为瓶颈。需评估是否可以拆分热点行

📖 延伸阅读