name: database-optimization description: SQL查询优化与数据库性能专家。用于优化慢查询、修复N+1问题、设计索引、实现缓存或提升数据库性能。支持PostgreSQL、MySQL及其他数据库。 author: Joseph OBrien status: unpublished updated: ‘2025-12-23’ version: 1.0.1 tag: skill type: skill
数据库优化
本技能用于优化数据库性能,包括查询优化、索引策略、N+1问题解决和缓存实现。
何时使用此技能
- 优化慢速数据库查询时
- 修复N+1查询问题时
- 设计索引时
- 实现缓存策略时
- 优化数据库迁移时
- 提升数据库性能时
此技能的功能
- 查询优化:分析与优化SQL查询
- 索引设计:创建合适的索引
- N+1问题解决:修复N+1查询问题
- 缓存:实现缓存层(Redis、Memcached)
- 迁移优化:优化数据库迁移
- 性能监控:设置查询性能监控
使用方法
优化查询
优化这个慢速数据库查询
修复这段代码中的N+1查询问题
特定分析
分析查询性能并建议索引
优化领域
查询优化
技术:
- 使用EXPLAIN ANALYZE
- 优化JOIN操作
- 减少数据扫描
- 使用合适的索引
- 避免SELECT *
索引设计
策略:
- 为频繁查询的列创建索引
- 为多列查询创建复合索引
- 避免过度索引
- 监控索引使用情况
- 删除未使用的索引
N+1问题
模式:
# 错误:N+1查询
users = User.all()
for user in users:
posts = Post.where(user_id=user.id) # N个查询
# 正确:使用JOIN的单次查询
users = User.all().includes(:posts) # 1个查询
示例
示例1:查询优化
输入:优化慢速用户查询
输出:
## 数据库优化:用户查询
### 当前查询
```sql
SELECT * FROM users
WHERE email = 'user@example.com';
-- 执行时间:450ms
分析
- 全表扫描(email列无索引)
- 扫描100万+行数据
优化
-- 添加索引
CREATE INDEX idx_users_email ON users(email);
-- 优化后的查询
SELECT id, email, name FROM users
WHERE email = 'user@example.com';
-- 执行时间:2ms
影响
- 查询时间:450ms → 2ms(提升99.5%)
- 索引大小:约50MB
## 最佳实践
### 数据库优化
1. **先测量**:使用EXPLAIN ANALYZE
2. **策略性索引**:并非每列都需要索引
3. **监控**:跟踪慢查询日志
4. **缓存**:缓存昂贵的查询
5. **反规范化**:根据读取模式合理使用
## 参考文件
- **`references/query_patterns.md`** - 常见查询优化模式、反模式及缓存策略
## 相关用例
- 查询优化
- 索引设计
- N+1问题解决
- 缓存实现
- 数据库性能提升