版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shuangmulin45/article/details/79992894
数据库注意事项
主要就是6点:
1. 必须考虑业务唯一性并建复合唯一索引
2. 所有字段尽量设置为not null
3. 区分度低的字段不要建索引
4. 逻辑外键要建索引
5. 用UUIDdelete_id varchar(32) NOT NULL DEFAULT ''
做伪删除
6. 建议确定无负数的字段设置unsigned
具体说明
建表时必须考虑业务唯一性, 比如工单的目标上报sku表
factory_mission_detail
, 一个工单只会且只能有一条记录描述单个sku的目标数量, 这种情况下就应该给工单ID(mission_id)和sku_id建立复合唯一索引, 并且要注意, 复合索引的顺序很重要也很关键, 复合索引遵循左前缀原则
, 就是查询的时候要数据库用上这个复合索引, 在where后面的条件就必须从左往右写, 比如上面的mission_id, sku_id
的复合索引, 在查询的时候就必须写成where mission_id = '' and sku_id = ''
, 否则无法使用该索引. 还有一点是一般我们建复合索引都要考虑查询需求, 比如我们一般会查工单下的sku情况, 而不会出现查某个sku的工单, 所以这个复合索引应该要建成mission_id, sku_id
而不是sku_id, mission_id
. 总结来说, 就是表达范围大的放前面, 表达范围小的放后面.好处:
- 可以保证数据层面上不会出现重复数据, 是表单重复提交的最后一道屏障
- 提高查询效率
设计字段时尽量设置字段不能为NULL, 因为在MySQL, NULL值会影响加在字段上的索引效率, 并且会有额外的空间占用, 并且会给应用程序带来很多空指针风险. 具体使用分3种情况:
- 业务需求上要求不能为空并且指明有默认值, 比如状态会有个默认状态, 这种情况就设置为
not null default '默认值'
- 业务需求上要求不能为空并且没有默认值, 这种情况表示没有该字段整条数据都没有意义, 比如节点上报的节点ID为空是没有意义的, 直接设置为
not null
即可 - 业务需求上要求必须有空值表达逻辑, 尽量不要出现这种情况,
varchar
可以用空字符串当默认值,int
可以用0或者-1当默认值
- 业务需求上要求不能为空并且指明有默认值, 比如状态会有个默认状态, 这种情况就设置为
- 索引不要随便建, 区分度小的字段建索引是没有意义的, 不能提高查询效率还影响增删改效率. 比如状态值
status
, 理论上所有枚举字段都不应该加索引. - 一般需要join的字段(就是逻辑外键)应该要建普通索引, 否则在join的时候会全表扫描
- 假删除考虑唯一键问题, 使用一个无意义的UUID字段(
delete_id varchar(32) NOT NULL DEFAULT ''
)表示被删除, 如果为空字符串则表示改数据没有被删除, 否则表示被删除. 这么做的话就需要把该表的所有唯一索引(注意是唯一索引)和该字段组成复合索引, 这里要特别小心不要把delete_id
建到其它唯一索引的前面, 一定要跟在后面, 比如第一条的mission_id, sku_id
复合唯一索引加上delete_id
之后必须是mission_id, sku_id, deleted_id
. - 最后一条建议, 在设置数值的时候如果业务上确定不会有负数, 建议设置为
unsigned(无符号)
, 可以在占用相同空间的前提下可以加大正数范围