先祝大家新年快乐,希望新的一年万事如意,事业高升。
1,命名规范
表名、字段名、索引名采用小写字母,尽量做到见名知义,避免使用缩写。
特别要强调的是MySQL在win系统下不区分大小写,但是在Linux系统是区分大小写的,所以尽量不要使用大写字母,可以避免节外生枝。
2,表必备三字段:id,create_time,update_time
id作为主键,建议使用无符号bigint,可以支持的范围是0-,足以满足我们的业务需要。
如果id需要对外展示,比如id作为订单id等,可以使用雪花算法生成的id。
雪花算法生成的id步长不固定,但是仍然遵守大致递增的规律,对MySQL性能没有影响的同时,又可以很好的保证竞争对手无法通过订单id推算订单量。
create_time表示记录创建时间,update_time表示记录更新时间。
3,不要使用保留字
使用保留字可能会在某些场景下出现莫名其妙的bug。
常见的保留字如:desc、case、revoke等。
4,尽量不要使用物理删除
使用逻辑删除可以让我们追踪记录的变化情况,在很多关键时刻是可以用来救命的。
而一旦使用物理删除,那记录就很难找回了。
当然,逻辑删除可能会对唯一索引造成影响。
5,小数类型使用decimal,禁止使用float和double
float和double都存在精度损失的问题,使用decimal可以对数字进行精确的保存。
金融领域还有一种常见的做法是使用int类型,保存单位为分的数字,只不过使用时需要进行转换。
6,选择合适的字符长度
恰当的字符长度可以节约数据库表空间,索引空间,还可以提升检索的速度。
比如人的年龄使用无符号tinyint,范围为0-。
姓名使用varchar(20),按照规定,汉族名字最多为6个字,但是还要考虑到少数民族的朋友。
性别使用tinyint,手机号使用char(11)等等。
7,字段尽量定义为notnull
每个默认值为null的字段会在行头额外占据1个字节的存储空间,还可能使得我们的sql产生预期外的结果。
8,大字段尽量拆分到扩展表
不建议在一张表中过多的使用大字段,比如varchar(),text类型等。
大字段的查询频率一般不会太高,放到主表中会拖累索引效率,建议放到单独的扩展表中,通过主键关联即可。
9,合理的使用索引
不要吝啬创建索引,索引的目的就是为了加速查询,只要对业务有帮助就可以使用。
当前,也不要滥用,尽量对索引进行评估,该合并的索引就合并为联合索引。
10,不必强求数据库三范式
三大范式产生的背景是资源紧张不足,我们只能尽可能地节约资源,从而获得更高的性能。
但是现在随着技术的发展,服务器的性能也越来越强,我们在设计表时,通过适当的字段冗余,来获取更高更快的查询性能也是没有问题的。
11,使用InnoDB引擎
InnoDB引擎已经一统天下,这个也没什么争议。
12,字符集统一采用utf8mb4
utf8mb4可以支持存储emoji表情,统一字符集的好处在于,不会让索引在某些场景下失效。
13,没必要提前分库分表
单表容量达到2个G或者数据量万以上再考虑分库分表,提前分库分表可能会带来适得其反的效果。
14,时间字段建议选择datetime
在一张表中,时间字段是必不可少的,如创建时间,更新时间等。
datetime格式是yyyy-mm-ddhh:mm:ss,占8个字节,并且与时区无关,建议优先考虑。
最后
本文给大家分享了设计表时的一些经验准则,如果您有更好的优化经验,也欢迎在评论区分享指正。
#我们一起跨年#
我是
程序员拾山,坚持每日技术分享,期待与大家一起学习成长,也感谢您的点赞和