一、索引优化
- 核心目标
通过减少全表扫描、加速查询响应,提升数据库性能。 - 关键策略
- 索引设计原则
- 选择性高:在区分度高的字段(如用户ID)上创建索引,避免在低区分度字段(如性别)或含大量
NULL
值的列上建索引。 - 组合索引:遵循“最左前缀原则”,按查询条件顺序设计,如
WHERE a=1 AND b=2
对应索引(a, b)
。 - 覆盖索引:将查询字段全部包含在索引中,避免回表查询。
- 选择性高:在区分度高的字段(如用户ID)上创建索引,避免在低区分度字段(如性别)或含大量
- 索引优化技巧
- 避免过多索引(影响写入性能),定期分析索引使用率并删除低效索引。
- 使用
EXPLAIN
分析查询执行计划,验证索引是否生效。
- 维护建议
- 定期执行
ANALYZE TABLE
更新统计信息,OPTIMIZE TABLE
重建碎片化索引。
- 定期执行
- 索引设计原则
- 示例代码(Java)
// 使用覆盖索引优化查询 SELECT user_id, name FROM users WHERE email = 'user@example.com';
二、分库分表
- 适用场景
- 单表数据量超过500万行或容量超过2GB,或高并发场景下单库性能瓶颈。
- 分库解决磁盘IO和连接数瓶颈,分表解决CPU负载和单表查询效率问题。
- 分库分表策略
- 垂直拆分
- 分库:按业务模块拆分(如用户库、订单库),降低耦合度。
- 分表:按字段活跃度拆分(如用户表拆分为基础信息表和扩展信息表)。
- 水平拆分
- 分片规则:
- 哈希分片:均匀分布数据(如
user_id % N
),但扩容需迁移数据。 - 范围分片:按时间或ID范围划分,适合有序查询但数据分布可能不均。
- 配置路由:通过路由表动态管理分片,灵活但需维护路由信息。
- 哈希分片:均匀分布数据(如
- 分表实现:如订单表按月份拆分为
orders_2023_01
、orders_2023_02
等。
- 分片规则:
- 垂直拆分
- 挑战与解决方案
- 跨分片查询:需业务层合并结果(如
UNION ALL
或分页游标)。 - 分布式事务:采用最终一致性方案(如TCC、Saga模式)。
- 数据迁移:通过中间件(如ShardingSphere)透明处理分片扩容。
- 跨分片查询:需业务层合并结果(如
三、读写分离
- 核心目标
通过主从复制分离读写流量,提升数据库吞吐量。 - 实现方式
- 主从复制:主库处理写操作,从库同步数据并处理读请求。
- 中间件方案:如MySQL Atlas、Mycat,自动路由读写请求。
- 应用层封装:通过数据访问层(DAO)区分读写库连接。
- 主从延迟问题
- 原因:同步延迟可能导致读到旧数据(如用户注册后立即查询不到)。
- 解决方案:
- 关键业务强制走主库(如登录、支付)。
- 使用延迟补偿(如强制等待同步完成)。
四、综合优化建议
- 分层优化策略
- 查询优化:避免
SELECT *
、减少复杂JOIN
,使用预编译SQL。 - 缓存加速:结合Redis缓存热点数据,降低数据库压力。
- 硬件与配置:升级SSD、调整数据库参数(如
innodb_buffer_pool_size
)。
- 查询优化:避免
- 监控与运维
- 部署Prometheus/Grafana监控数据库性能指标(如QPS、慢查询)。
- 定期备份与恢复演练,确保数据安全。
五、总结
数据库优化需结合具体业务场景,综合运用索引、分库分表、读写分离等技术。例如:
- 高并发读场景:读写分离 + 缓存 + 覆盖索引。
- 海量数据场景:水平分表 + 哈希分片 + 分区表。
- 事务密集场景:垂直分库 + 最终一致性方案。
通过分阶段优化(如先索引后分库分表)和持续监控,可显著提升系统性能与扩展性。