一、数据库表设计
表设计相当重要,有时为了性格,在可保持一致性的情况下,可以违返四个范式:
- 不使用外键,关联更新、删除操作由业务代码层去处理。
- 根据需要冗余字段,以提高查询性能。
- 使用索引,索引查询业务关键字段。
二、数据库部署
根据访问需求确定是主从、主主、或更大的集群部署。
三、单个数据库性能优化
1. 数据库配置优化
使用InnoDB引擎作为MySQL引擎。
# 索引缓存区大小,一般设置物理内存的30-40%
key_buffer_size = 16M
# 读操作缓冲区大小,推荐设置16M或32M
read_buffer_size = 128K
# InnoDB参数默认值:
# 索引和数据缓冲区大小,一般设置物理内存的60%-70%
innodb_buffer_pool_size = 128M
# 缓冲池实例个数,推荐设置4个或8个
innodb_buffer_pool_instances = 1
# 关键参数,0代表大约每秒写入到日志并同步到磁盘,数据库故障会丢失1秒左右事务数据。1为每执行一条SQL后写入到日志并同步到磁盘,I/O开销大,执行完SQL要等待日志读写,效率低。2代表只把日志写入到系统缓存区,再每秒同步到磁盘,效率很高,如果服务器故障,才会丢失事务数据。对数据安全性要求不是很高的推荐设置2,性能高,修改后效果明显。
innodb_flush_log_at_trx_commit = 1
# 默认是共享表空间,共享表空间idbdata文件不断增大,影响一定的I/O性能。推荐开启独立表空间模式,每个表的索引和数据都存在自己独立的表空间中,可以实现单表在不同数据库中移动。
innodb_file_per_table = OFF
# 日志缓冲区大小,由于日志最长每秒钟刷新一次,所以一般不用超过16M
innodb_log_buffer_size = 8M
由上参数,大致为以下几点的优化:
- 内存缓冲区优化
- 磁盘写入优化
2. 操作系统内核优化
- 优化系统文件描述限制
- 文件系统(xfs、ext4)
3. 硬件优化
- 加大物理内存
- 加快磁盘速度(SSD + 主从)
四、数据库架构扩展
- 主从复制
- 主、主复制
- 读写分离
这时可以使用MyCat中间件以实现对上层业务层代码的适配。
对于一致性很强的场景,可以在上层业务层作MQ。
数据量极大或查询要求极高时,可以牺牲一些业务功能来实现性能提升,一般情况下是:
- 分库 (纵向)
- 分表 (横向)
- 分区