雨燕apply项目总结
1,数据库默认值的问题
数据库尽量是非空的,然后不设置默认值,默认值由程序来设计
因为如果程序中设计有错误,应该是空值的地方没有没有处理掉,那插入数据库的时候应该报错,但如果你设置了默认值,排查将会变得困难
2,数据库唯一索引
如果可以是唯一索引的地方就添加唯一索引,包括联合唯一索引,例如,在一个多对多的中间表,两个字段确定一条唯一的数据,这两个字段就要加联合唯一索引了,因为在并发的情况下,容易插入两条这样的数据,这是不合理的
3,分库分表
整体理论:https://juejin.im/entry/5b5eb7f2e51d4519700f7d3c
整体和redis的分库分表策略一样
单库:1,单库所在服务器上磁盘空间不足,2,MySQL理论上也是一台服务器,单库上操作的IO瓶颈,注定了他也是有并发场景。
单表:1,索引膨胀,查询超时,数据量大的时候每次crud都要重新修改索引
分表策略:
- 库名规范:{dbName}[0-N],表名规范:{tableName}_[0-15]
- 桶和表配置 4096 * 16(每个库下面最多16张表)
- 库的下标范围0, 4095,表的下标范围0, 15
- 定位方式,根据定位的objectId(接口实现 String getObjectId();) md5值后取前4位
- 取桶号:4位字符串中前三位0, 3转16进制
- 取表号:4位字符串中的最后一位3, 4转16进制
通过计算到分表策略后,到主库的策略表里面,获得这个index号是哪个库负责的,(从库可以是在不同数据库,在程序中已经注入了他的数据源