mysql数据库优化剖析
现实中很多项目的瓶颈最终都会落在数据库上。
刨除缓存和服务器配置差异,同样的配置,好的数据库设计能比劣质设计性能高出n倍,视觉上也会更有美感。
不讨论过多的细节,对于数据库优化主要有一下几个要点:
1、数据库结构优化:分库、分表、分区
- 分区是一种简单的水平拆分,只需要在表结构设计时加上分区参数,不需要代码管理。分区可以让单表的存储量更多,也可以提高检索的速度。
- 分表就是把一张大表,按照不同的规则分成多张小表,通常有垂直拆分和水平拆分两种,适合各个表之间关联度不高的场景。
- 分库就是把一个数据库按照不同的规则或者业务需求分成多个库,像游戏的不同服、saas平台的不同商家端。
2、表结构优化
- 使用可存下数据的最小数据类型
- 尽可能不用null,数组可以用0代替,字符串可以用''代替
- 尽量少用text,非用不可时尽量放在分表
- 单表不要有太多字段,建议20个以内
- 确定长度的字段用固定长度表,检索速度更快
- 同一模块的表尽可能使用相同的前缀,表名尽可能表达含义
- 所有字段名称都用小写字母,多词用"_"连接
3、索引优化
- 选择离散度大的列做索引
- 索引字段越小越好
- 适当建立联合索引,离散度大的列放在联合索引前面
- 索引不是越多越好,建立索引要适当
4、sql语句优化
- 查看慢查询日志
- 用explain分析sql的执行计划
- 减少大表之间的join
- 避免用select *,列出需要的查询字段即可
- 避免or连接词,可以的话用IN代替
- 避免在sql语句中进行列运算
- 避免使用左侧模糊查询
5、存储引擎优化
- 无特别要求存储引擎都使用innodb
- innodb为行锁插入性能更优
- 如果事务操作里面有包含mysiam引擎的表,会使事务失
另外就是一些比较琐碎的优化项了,比如,尽量不在循环中进行数据库操作,尽量减少查询数据库的次数、添加数据库连接池、必要的时候使用中间件解决异表间的搜索排序问题。