1. 减少数据量
1.1 选择合适的数据类型: 在表设计阶段,为各个字段选择尽可能小的数据类型,同时压缩字段。例如,对于非检索字段,可以选择将其转换为 JSON 存储或使用冷热数据隔离。
1.2 数据归档: 将历史数据迁移到历史归档表,通过定时任务实现部分主表数据的迁移,以减少主表数据量。
1.3 生成中间表: 使用中间表存储复杂查询结果,通过定时调度任务更新中间表,以降低复杂查询对原有数据源的压力。
1.4 分库分表: 在分布式环境中,考虑采用分库分表来水平扩展数据库,但要注意开发和运维成本。
2. 空间换时间
2.1 增加硬件资源: 提升性能可以通过堆硬件资源,例如增加内存、调整缓冲池大小等,以提高数据库的读写性能。
2.2 引入缓存中间件: 使用中间件如 Redis 作为分布式缓存,适用于高并发读取和长时间不变的数据,采用旁路缓存策略,提高读取效率。
3. 更换架构
3.1 选择非关系型数据库: 根据业务场景,考虑使用非关系型数据库,如 Redis、HBase、MongoDB、Elasticsearch、ClickHouse 等,以满足特定需求。
3.2 读写分离和集群: 在关系型数据库中,实施读写分离和数据库集群,将压力分散到多个机器上,提高数据库的整体性能。
3.3 分布式数据库: 考虑使用分布式数据库系统,如 TiDB,实现分布式存储和查询,提高数据库的扩展性和容错性。
规范汇总
- 规范命名:表字段、索引名、表名应见名知意,选择合适的字段类型,尽量避免使用 null 作为默认值。
- 优化主键:推荐使用自增主键,避免复合主键,非分库分表设计首选。
- 控制字段数量:单表字段不宜过多,实现冷热字段分离,使用中间表存储复杂查询结果。
- 合理使用缓存:引入缓存中间件如 Redis,实施合理的缓存策略,减轻数据库读取压力。
- 索引优化:不要过多索引,合理选择字段建立联合索引,注意区分度高的字段放在左边。
- 数据库扩展:根据业务需求,考虑数据库的扩展性,可以选择分库分表、读写分离、集群等方式。