现实中很多项目的瓶颈最终都会落在数据库上。
刨除缓存和服务器配置差异,同样的配置,好的数据库设计能比劣质设计性能高出n倍,视觉上也会更有美感。

不讨论过多的细节,对于数据库优化主要有一下几个要点:

1、数据库结构优化:分库、分表、分区

  • 分区是一种简单的水平拆分,只需要在表结构设计时加上分区参数,不需要代码管理。分区可以让单表的存储量更多,也可以提高检索的速度。
  • 分表就是把一张大表,按照不同的规则分成多张小表,通常有垂直拆分和水平拆分两种,适合各个表之间关联度不高的场景。
  • 分库就是把一个数据库按照不同的规则或者业务需求分成多个库,像游戏的不同服、saas平台的不同商家端。

2、表结构优化

  • 使用可存下数据的最小数据类型
  • 尽可能不用null,数组可以用0代替,字符串可以用''代替
  • 尽量少用text,非用不可时尽量放在分表
  • 单表不要有太多字段,建议20个以内
  • 确定长度的字段用固定长度表,检索速度更快
  • 同一模块的表尽可能使用相同的前缀,表名尽可能表达含义
  • 所有字段名称都用小写字母,多词用"_"连接

3、索引优化

  • 选择离散度大的列做索引
  • 索引字段越小越好
  • 适当建立联合索引,离散度大的列放在联合索引前面
  • 索引不是越多越好,建立索引要适当

4、sql语句优化

  • 查看慢查询日志
  • 用explain分析sql的执行计划
  • 减少大表之间的join
  • 避免用select *,列出需要的查询字段即可
  • 避免or连接词,可以的话用IN代替
  • 避免在sql语句中进行列运算
  • 避免使用左侧模糊查询

5、存储引擎优化

  • 无特别要求存储引擎都使用innodb
  • innodb为行锁插入性能更优
  • 如果事务操作里面有包含mysiam引擎的表,会使事务失

另外就是一些比较琐碎的优化项了,比如,尽量不在循环中进行数据库操作,尽量减少查询数据库的次数、添加数据库连接池、必要的时候使用中间件解决异表间的搜索排序问题。

标签: none

添加新评论