随着公司业务越来越大,暴露的问题越来越多,主要是数据库压力太大
前期追求快速实现业务,忽略了性能的考虑
特写一些历史教训
系统设计之初,从三个角度出发:产品、架构、数据库设计:
- 产品角度
直接pass掉不合理的需求,挖掘真正的需求,优化需求 - 架构设计
走缓存,读写分离,异步,服务拆分 - 数据库角度
建索引,分库、分表
建表意见:
1、一定要有自增id,而且必须是primary key
自增id会影响读和写的效率
详细原因转载[mysql自增id对于效率非常重要](https://www.jb51.net/article/161312.htm)
2、关联表,不管是父子表还是大表小表,一定用主键id关联,联表查询一定用id
3、最好不要在数据库上建外键约束,而是在代码层面去约束
查询优化:
1、inner join 联表用join,禁止用where 条件联表,因为where联表要先做笛卡尔积再计算,浪费内存浪费时间
2、多表联查(超过三个表),分开查
3、索引优化
4、count(*)占内存,不要时时刻刻做count(*),可以做个短时间缓存,或者读写分离
5、对于特殊sql,用explain看用的索引是否合理,如果索引使用不合理,
可以强制显示使用合理的索引,非常有用。
如果order by的字段没有在where条件里,是不会走索引的,所以可以尝试显示指定使用索引,这种情况需要在实际场景下验证
运维要做的事情:
1、不同的业务连接数据库,分用户,方便定位问题
2、一定要定期分析慢查询
3、清理碎片
优化参数
慢查询定期分析—目的是优化sql,一定要在开始打好基础,事情不难,最怕忽略这件事,拖到最后,业务复杂,不好优化
nginx访问日志定期分析
- 特殊sql
distinct 和order by一起使用会建立临时表,建立临时表会花费时间