一、优化核心思路:分层递进策略
优化层次 | 优化手段 | 预期收益 | 实施难度 |
|---|---|---|---|
SQL与索引 | 慢查询分析、索引优化 | 性能提升50%-90% | 低(见效快) |
架构设计 | 分库分表、读写分离 | 提升数倍至数十倍 | 中(需改造) |
参数配置 | 内存分配、连接池调优 | 提升20%-50% | 中(需测试) |
硬件资源 | SSD、内存扩容 | 提升30%-100% | 低(成本高) |
应用层优化 | 缓存、异步处理 | 降低数据库压力 | 高(架构调整) |
优化原则:先易后难,先SQL后架构,先软件后硬件,80%的性能问题可通过SQL和索引优化解决。
二、SQL与索引优化(见效最快的优化手段)
1. 慢查询分析与定位
-- MySQL开启慢查询日志 SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; -- 超过1秒记录 SET GLOBAL log_queries_not_using_indexes = 'ON'; -- 使用EXPLAIN分析执行计划 EXPLAIN SELECT * FROM users WHERE age > 30; -- 使用SHOW PROFILE分析执行细节 SET profiling = 1; SELECT * FROM orders WHERE user_id = 100; SHOW PROFILE FOR QUERY 1;关键关注点:
type:ALL(全表扫描)→ index/range/ref
key:是否使用索引
rows:扫描行数(越少越好)
Extra:Using filesort、Using temporary(需优化)
2. 索引优化核心原则
最左前缀原则:联合索引(a,b,c),查询条件必须包含a才能使用索引
覆盖索引:查询字段都在索引中,避免回表
避免索引失效:函数计算、类型转换、OR条件、LIKE '%xx%'会导致索引失效
索引选择性:区分度高的字段适合建索引(如性别不适合,手机号适合)
3. 常见SQL优化场景
场景1:避免SELECT*
-- 反例:查询所有字段,可能回表 SELECT * FROM users WHERE age > 30; -- 优化:只查询需要的字段 SELECT id, name FROM users WHERE age > 30;场景2:避免大表JOIN
-- 反例:大表JOIN导致性能问题 SELECT * FROM orders o JOIN users u ON o.user_id = u.id WHERE u.create_time > '2024-01-01'; -- 优化:先过滤再JOIN,或使用子查询 SELECT * FROM orders o WHERE o.user_id IN (SELECT id FROM users WHERE create_time > '2024-01-01');场景3:分页优化
-- 反例:OFFSET过大导致性能差 SELECT * FROM orders ORDER BY id LIMIT 1000000, 20; -- 优化:使用WHERE条件+索引 SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 20;场景4:避免IN/OR导致索引失效
-- 反例:IN条件过多或OR导致索引失效 SELECT * FROM users WHERE status IN (1,2,3,4,5,6,7,8,9,10); -- 优化:使用UNION或改写为范围查询 SELECT * FROM users WHERE status = 1 UNION ALL SELECT * FROM users WHERE status = 2 ...4. 索引设计最佳实践
主键索引:自增ID或业务无关主键
唯一索引:保证字段唯一性
联合索引:根据查询条件顺序创建(WHERE条件在前,ORDER BY在后)
前缀索引:对长字符串字段,使用前N个字符建索引
定期维护:删除无用索引,重建碎片化索引
三、数据库架构优化(应对大数据量)
1. 读写分离
主库:写操作
从库:读操作(可多个)
实现方式:MySQL主从复制、中间件(MyCat、ShardingSphere)
注意点:主从延迟、数据一致性
2. 分库分表
垂直分表:按业务模块拆分(用户库、订单库)
水平分表:按数据范围或哈希分表(如按用户ID取模)
分片策略:范围分片、哈希分片、一致性哈希
挑战:跨分片查询、事务一致性、全局ID生成
3. 数据归档与冷热分离
热数据:近期数据,频繁访问,使用高性能存储
冷数据:历史数据,访问少,可归档到廉价存储
实现方式:定时任务迁移、分区表(MySQL Partition)