数据库优化一般策略

一、数据库表设计

表设计相当重要,有时为了性格,在可保持一致性的情况下,可以违返四个范式:

  1. 不使用外键,关联更新、删除操作由业务代码层去处理。
  2. 根据需要冗余字段,以提高查询性能。
  3. 使用索引,索引查询业务关键字段。

二、数据库部署

根据访问需求确定是主从、主主、或更大的集群部署。

三、单个数据库性能优化

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 

由上参数,大致为以下几点的优化:

  1. 内存缓冲区优化
  2. 磁盘写入优化

2. 操作系统内核优化

  1. 优化系统文件描述限制
  2. 文件系统(xfs、ext4)

3. 硬件优化

  1. 加大物理内存
  2. 加快磁盘速度(SSD + 主从)

四、数据库架构扩展

  1. 主从复制
  2. 主、主复制
  3. 读写分离

这时可以使用MyCat中间件以实现对上层业务层代码的适配。

对于一致性很强的场景,可以在上层业务层作MQ。

数据量极大或查询要求极高时,可以牺牲一些业务功能来实现性能提升,一般情况下是:

  1. 分库 (纵向)
  2. 分表 (横向)
  3. 分区

猜你喜欢

转载自my.oschina.net/kut/blog/1823741