数据库管理Skill database

数据库管理技能专注于数据库系统的优化、维护和操作,包括查询调优、索引策略、数据迁移、备份恢复和性能监控,以提升数据库性能和可靠性。关键词:数据库、SQL、性能优化、索引、迁移、备份、缓存、健康检查。

后端开发 0 次安装 0 次浏览 更新于 3/12/2026

name: 数据库 description: 数据库优化、查询调优、迁移和管理。用于数据库性能问题、模式设计或操作任务。

数据库管理

优化查询、管理模式并确保可靠性。

何时使用

  • 慢查询优化
  • 模式设计和迁移
  • 索引策略
  • 数据库操作
  • 性能调优

查询优化

分析查询

-- PostgreSQL
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT * FROM orders WHERE user_id = 123;

-- MySQL
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 123;

常见优化

-- 添加缺失索引
CREATE INDEX CONCURRENTLY idx_orders_user_id
ON orders(user_id);

-- 复合索引用于常见查询
CREATE INDEX idx_orders_user_date
ON orders(user_id, created_at DESC);

-- 部分索引用于过滤查询
CREATE INDEX idx_active_orders
ON orders(user_id) WHERE status = 'active';

-- 覆盖索引以避免表查找
CREATE INDEX idx_orders_covering
ON orders(user_id) INCLUDE (total, status);

迁移最佳实践

-- 安全列添加(无锁)
ALTER TABLE users ADD COLUMN preferences JSONB;

-- 安全列重命名(使用视图兼容性)
ALTER TABLE users RENAME COLUMN name TO full_name;
CREATE VIEW users_compat AS
  SELECT *, full_name as name FROM users;

-- 安全索引创建
CREATE INDEX CONCURRENTLY idx_new ON table(column);

-- 批量回填
UPDATE users SET new_col = compute(old_col)
WHERE id BETWEEN 1 AND 10000;
-- 重复下一批

操作查询

健康检查

-- 活动连接(PostgreSQL)
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state;

-- 长时间运行查询
SELECT pid, now() - query_start as duration, query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > '5 minutes'::interval;

-- 表大小
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;

-- 索引使用
SELECT indexrelname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;

维护

-- PostgreSQL 清理和分析
VACUUM ANALYZE table_name;

-- 重新索引
REINDEX INDEX CONCURRENTLY idx_name;

-- 终止长时间查询
SELECT pg_terminate_backend(pid);

缓存策略

import redis

cache = redis.Redis()

def get_user(user_id: int) -> dict:
    # 首先尝试缓存
    cached = cache.get(f"user:{user_id}")
    if cached:
        return json.loads(cached)

    # 查询数据库
    user = db.query("SELECT * FROM users WHERE id = %s", user_id)

    # 使用 TTL 缓存
    cache.setex(f"user:{user_id}", 3600, json.dumps(user))
    return user

def invalidate_user(user_id: int):
    cache.delete(f"user:{user_id}")

示例

输入: “这个查询很慢” 操作: 运行 EXPLAIN,识别缺失索引或不良计划,优化

输入: “设置数据库备份” 操作: 配置 pg_dump/mysqldump,设置计划,测试恢复