数据库注意事项

数据库注意事项

主要就是6点:
1. 必须考虑业务唯一性并建复合唯一索引
2. 所有字段尽量设置为not null
3. 区分度低的字段不要建索引
4. 逻辑外键要建索引
5. 用UUIDdelete_id varchar(32) NOT NULL DEFAULT ''做伪删除
6. 建议确定无负数的字段设置unsigned

具体说明

  1. 建表时必须考虑业务唯一性, 比如工单的目标上报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. 总结来说, 就是表达范围大的放前面, 表达范围小的放后面.

    好处:

    1. 可以保证数据层面上不会出现重复数据, 是表单重复提交的最后一道屏障
    2. 提高查询效率
  2. 设计字段时尽量设置字段不能为NULL, 因为在MySQL, NULL值会影响加在字段上的索引效率, 并且会有额外的空间占用, 并且会给应用程序带来很多空指针风险. 具体使用分3种情况:

    1. 业务需求上要求不能为空并且指明有默认值, 比如状态会有个默认状态, 这种情况就设置为not null default '默认值'
    2. 业务需求上要求不能为空并且没有默认值, 这种情况表示没有该字段整条数据都没有意义, 比如节点上报的节点ID为空是没有意义的, 直接设置为not null即可
    3. 业务需求上要求必须有空值表达逻辑, 尽量不要出现这种情况, varchar可以用空字符串当默认值, int可以用0或者-1当默认值
  3. 索引不要随便建, 区分度小的字段建索引是没有意义的, 不能提高查询效率还影响增删改效率. 比如状态值status, 理论上所有枚举字段都不应该加索引.
  4. 一般需要join的字段(就是逻辑外键)应该要建普通索引, 否则在join的时候会全表扫描
  5. 假删除考虑唯一键问题, 使用一个无意义的UUID字段(delete_id varchar(32) NOT NULL DEFAULT '')表示被删除, 如果为空字符串则表示改数据没有被删除, 否则表示被删除. 这么做的话就需要把该表的所有唯一索引(注意是唯一索引)和该字段组成复合索引, 这里要特别小心不要把delete_id建到其它唯一索引的前面, 一定要跟在后面, 比如第一条的mission_id, sku_id复合唯一索引加上delete_id之后必须是mission_id, sku_id, deleted_id.
  6. 最后一条建议, 在设置数值的时候如果业务上确定不会有负数, 建议设置为unsigned(无符号), 可以在占用相同空间的前提下可以加大正数范围
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值