数据库性能优化方法
... 次阅读 2025年5月18日

数据库性能直接影响应用响应速度。本文将详细介绍数据库性能优化的方法。
性能问题表现
- 查询响应慢
- 连接数过高
- CPU占用高
- 磁盘IO高
- 死锁频繁
索引优化
索引的重要性
索引是数据库性能优化的核心,合理的索引可以大幅提升查询速度。
索引创建原则
适合创建索引:
- 主键
- 频繁查询的字段
- 排序字段
- 分组字段
- 外键关联字段
不适合创建索引:
- 数据量小的表
- 频繁更新的字段
- 区分度低的字段
索引使用技巧
最左前缀原则:
sql
-- 索引 (a, b, c)
WHERE a = 1 AND b = 2 -- 走索引
WHERE b = 2 AND c = 3 -- 不走索引
WHERE a = 1 AND c = 3 -- 部分走索引避免索引失效:
sql
-- 不推荐
WHERE YEAR(create_time) = 2024
-- 推荐
WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'索引监控
sql
-- 查看索引使用情况
SHOW INDEX FROM table_name;
-- 分析查询执行计划
EXPLAIN SELECT * FROM table_name WHERE condition;查询优化
避免全表扫描
sql
-- 不推荐
SELECT * FROM users
-- 推荐
SELECT id, name FROM users WHERE status = 1优化JOIN查询
sql
-- 小表驱动大表
SELECT * FROM small_table s
JOIN large_table l ON s.id = l.small_id避免子查询
sql
-- 不推荐
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders)
-- 推荐
SELECT DISTINCT u.* FROM users u
JOIN orders o ON u.id = o.user_id分页优化
sql
-- 传统分页(数据量大时慢)
SELECT * FROM users LIMIT 10000, 10
-- 优化分页
SELECT * FROM users WHERE id > 10000 LIMIT 10表结构优化
字段类型选择
| 类型 | 推荐 | 说明 |
|---|---|---|
| 整数 | INT/BIGINT | 根据范围选择 |
| 字符串 | VARCHAR | 避免TEXT |
| 时间 | DATETIME | 统一格式 |
| 金额 | DECIMAL | 避免FLOAT |
范式与反范式
范式化:
- 减少数据冗余
- 更新效率高
- 查询可能需要JOIN
反范式化:
- 查询效率高
- 数据冗余
- 更新效率低
建议: 适度反范式,空间换时间。
分表分库
垂直分表:
- 大字段拆分
- 冷热数据分离
水平分表:
- 按规则拆分
- 如按时间、按ID
缓存优化
查询缓存
- Redis缓存热点数据
- 缓存查询结果
- 设置合理过期时间
应用层缓存
- 本地缓存
- 减少数据库访问
架构优化
读写分离
写操作
│
▼
┌───────┐
│ 主库 │
└───────┘
│
│ 同步
▼
┌───────┐
│ 从库 │ ← 读操作
└───────┘分库分表
- 按业务拆分
- 按数据量拆分
- 使用中间件(如ShardingSphere)
参数优化
MySQL关键参数
ini
# 连接数
max_connections = 1000
# 缓冲池
innodb_buffer_pool_size = 4G
# 日志
innodb_log_file_size = 512M
# 查询缓存
query_cache_size = 0 # MySQL 8.0已移除监控与诊断
慢查询日志
ini
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2性能监控工具
- MySQL Workbench
- pt-query-digest
- Prometheus + Grafana
总结
数据库性能优化要点:
- 索引优化:合理创建、避免失效
- 查询优化:避免全表扫描、优化JOIN
- 表结构优化:字段类型、分表分库
- 缓存优化:Redis缓存、减少访问
- 架构优化:读写分离、分库分表
持续监控、定期优化,保持数据库高性能。
