1. 数据库基础操作全解析
刚入行那会儿,我最头疼的就是数据库操作。明明SQL语法都背熟了,一到实际项目就手忙脚乱——连接超时、事务死锁、索引失效这些问题接踵而至。今天我就把十年踩坑经验浓缩成这篇实操指南,从最基本的CRUD到高阶优化技巧,手把手带你避开那些教科书不会告诉你的暗礁。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库连接配置
2.1 连接池参数调优
新手最容易忽视的就是连接池配置。以MySQL为例,我推荐用HikariCP而不是老旧的DBCP2。关键参数得根据业务特点调整:
java复制HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20); // 建议CPU核心数*2 + 磁盘数
config.setConnectionTimeout(30000); // 生产环境不要小于30s
config.setIdleTimeout(600000); // 空闲连接存活时间
警告:连接泄漏是性能杀手!务必配置leakDetectionThreshold(建议60秒),我用Arthas排查过太多未关闭连接的案例。
2.2 重试机制设计
网络抖动时盲目重试会雪崩。建议采用指数退避策略:
python复制def execute_with_retry(sql, max_retries=3):
base_delay = 0.1
for attempt in range(max_retries):
try:
return cursor.execute(sql)
except OperationalError as e:
if "Deadlock" in str(e):
time.sleep(base_delay * (2 ** attempt))
else:
raise
3. 基础CRUD性能陷阱
3.1 批量插入优化
单条insert循环是最差实践。实测10万条数据:
| 方案 | 耗时(s) |
|---|---|
| 单条插入 | 218 |
| 批量插入 | 5.7 |
| LOAD DATA | 1.2 |
MySQL批量插入要关闭autocommit:
sql复制START TRANSACTION;
INSERT INTO table VALUES (...),(...),(...);
COMMIT;
3.2 更新操作避坑
这三个错误我全都犯过:
- 忘记加WHERE条件全表更新(现在每次执行前必先SELECT验证)
- 大表直接UPDATE导致锁表(改用分批更新)
- 没处理并发冲突(后来都加version字段做乐观锁)
4. 查询优化实战
4.1 索引失效场景
上周刚解决的性能问题:某查询用不上索引,EXPLAIN显示全表扫描。原因竟是:
sql复制SELECT * FROM users WHERE DATE(create_time) = '2023-08-01' -- 错误
SELECT * FROM users WHERE create_time BETWEEN '2023-08-01 00:00:00' AND '2023-08-01 23:59:59' -- 正确
4.2 分页查询优化
传统LIMIT在大偏移量时性能骤降:
sql复制-- 反例(偏移10万条后取10条)
SELECT * FROM orders LIMIT 100000, 10;
-- 正例(先定位id再查询)
SELECT * FROM orders WHERE id > 上次最大id ORDER BY id LIMIT 10;
5. 事务与锁的深水区
5.1 事务隔离级别选择
电商项目血泪教训:默认的REPEATABLE-READ导致幻读,支付回调重复处理订单。后来改成:
sql复制SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
-- 关键业务操作
COMMIT;
5.2 死锁预防方案
我整理的四大死锁场景及应对:
- 交叉更新(统一更新顺序)
- 批量操作(减小事务粒度)
- 索引缺失(确保查询走索引)
- 长事务(拆分为短事务)
6. 实战问题排查记录
去年双十一遇到的典型问题:
- 慢查询日志发现某JOIN语句执行8秒
- 解决方案:添加联合索引(col1,col2)
- 连接数暴涨导致服务不可用
- 根因:某递归查询没有终止条件
- 主从同步延迟
- 最终方案:启用半同步复制
7. 数据库管理心得
- 备份策略:全量备份+binlog增量,我写了个自动校验备份完整性的脚本
- 监控指标:除了常规的QPS/TPS,我特别关注线程运行状态和锁等待
- 版本升级:先在从库测试,观察一周没问题再切主库
最后分享我的检查清单,每次上线前必看:
- [ ] 是否有未提交的事务
- [ ] 执行计划是否合理
- [ ] 错误日志是否有异常
- [ ] 监控大盘指标是否正常
