mysql建表优化

避免null

表字段尽量避免null的出现,因为null值无法走索引,若想使用,可以用0或特殊的值或空字符串;

数据类型

1尽量使用int而不是bigint,如果是非负的话还可以UNSIGNED,因为符号也会占一位,加上他的话可以扩大两倍;
2.char和varchar的选择,若想要查询速度快一些的话就用char,若想要省一些空间的话就用varchar,如果字段的长度确定,那就选择char,不确定就用varchar
3.小数尽量用精确值decimal,而不是double、float,在db中这两种保存的是近似值
4.日期datetime、timestamp,时间年限跨度比较大的用datetime(1000-9999,8字节),受时区影响的用timestamp(1970-2038,4字节).而且如果想要默认插入某数据时把当前时间当做默认值时只能使用timestamp

禁止外键

1.因为每次级联delete或update的时候,都要级联操作相关的外键表,不论有没有这个必要,由其在高并发的场景下,这会导致性能瓶颈
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源
3.若是高并发大流量事务场景,使用外键还可能容易造成死锁
4.有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素

总结
一、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键
二、如果为了高并发,分布式,使系统性能更优,以及更好维护,则一定不能使用外键
参考:https://blog.csdn.net/qq_22136439/article/details/103714369

自增主键

主键递增会在分布式系统中带来问题
在这里插入图片描述

采用"范围分片"形式,会产生"尾部热点"
尾部热点:当新的数据在进行插入的时候,所有的数据都被插入到了某一个数据库
此时所有的操作都集中在某一个数据库,数据库压力会很大。实现写操作会很慢,此时使用的hash分片的数据库就很具有优势。
那可以使用UUID来代替自增主键么
答:不可以,因为uuid会涉及到索引重排(b+树)

雪花算法

在这里插入图片描述
从左向右进行说明:

1)第1位(1bit)表示符号位。由于一般id都是正数,故此位是0;

2)第2-42位(41bit)表示时间戳,记录的是毫秒级的时间戳,大概可以使用69年;

3)第43-53位(10bit)表示工作机器的id(5位datacenterId+5位workerId);

4)第54-64位(12bit)表示序列化号,记录同毫秒内产生的不同id
参考:https://www.cnblogs.com/zys2019/p/15163982.html
优点:

  • 全局唯一:不能出现重复的ID号,既然是唯一标识,这是最基本的要求
  • 趋势递增:在Mysql的innoDB引擎使用的是聚集索引,由于多数RDBMS使用B+树的数据结构来存储索引数据,在主键的选择上面,我们应该尽量使用有序的主键保证写入性能。
  • 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号,IM增量消息,排序等特殊需求。
  • 信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定url即可;如果是订单号就更危险了,竞争对手可以直接指导我们一天的单量。所以在一些应用场景下,需要ID无规则不规则,让竞争对手不好猜。
  • 含时间戳:这样就能够在开发中快速了解这个分布式id的生成时间
    在分布式系统中,雪花算法可以保证数据的主键全局唯一且自增

缺点:
依赖机器时钟,如果机器时钟回拨,会导致重复ID生成

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值