请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于自增主键的问题

项目中可以进行增删的几个Entity, 如Shop, Product, ProductCategory 使用的都是自增主键。根据目前的代码数据库中的主键无论是否有删除操作都只能增大不能减小,那主键就会一直增大下去,这样随着数据不断的增加,根据innoDB引擎储存的结构,是不是会让数据库操作的效能持续下降?这种情况下有没有办法可以让数据库本身的自增主键在删除的时候回调?还有就是如果可以回调的话,在多线程操作数据库并实现读写分离的情况下是不是会出现数据丢失consistency的情况?

问题有点多,如果老师不方便一下讲清楚,能否推荐一些靠谱的解读性文章?谢谢老师

正在回答

2回答

翔仔 2020-06-13 00:04:12

同学好,主键一直增大下去对性能没什么影响吧,

这里顺便说一下,表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。即如果达到最大之后,就会产生主键冲突。

上面问题虽然和主键递增没关系,但是数据增多确实会影响查询性能,不过不明白同学说的回调是啥意思?是指主键回收重复使用吗?如果是的话,这个不需要调整,可以了解一下b+树的结构,存储是为查询服务的。

一般如果数据量达到一定程度(需要依据业务和压测情况定),就需要对数据进行水平切分了,也就是分表了。

在多线程操作数据库并实现读写分离的情况下是不是会出现数据丢失consistency的情况?这个肯定会,因为你读的是不同的库,由于网络原因导致的主从数据不及时同步会存在的,所以如果数据需要实时并且经常变更的话,最好走主库或者缓存。如果指的是插入失败的话不会,因为插入走的都是主库,会有锁来控制

1 回复 有任何疑惑可以回复我~
  • 提问者 慕用4013838 #1
    谢谢老师的回答。
    
    我自己又在网上查了一下。关于主键的增加,根据Mysql使用的B+树,我理解的是如果主键越来越大,这样的话B+树的层数就会变大,这样本来会造成查询性能的下降;但网上说InnoDB会有一个填充因子小于50%就进行合并操作的机制,所以删除掉一些数据后,尽管最大的主键可能很大,但B+树的层数仍然会比较小。不知道我理解的对不对?
    
    那个”回调“,我想问的就是回收。不过如果之前关于主键数值的问题如果我理解的正确的话,那好像回收的确是没有必要。
    
    关于水平切分,老师的意思是使用sharding对吗?
    
    最后关于丢失consistency的问题,就是说如果我使用诸如kafka这样可以制作MQ的module的话,或者是使用redis这样先进入缓存然后再持久化的数据库来辅助mysql,就可以解决一部分ocnsistency的问题了对吗?
    谢谢老师
    回复 有任何疑惑可以回复我~ 2020-06-13 12:00:38
  • 翔仔 回复 提问者 慕用4013838 #2
    关于水平切分,老师的意思是使用sharding对吗? 是的,可以这么理解,类似取模决定存到表1-表N
    最后关于丢失consistency的问题:是可以的,异步入库能够确保数据不丢失
    回复 有任何疑惑可以回复我~ 2020-06-14 21:52:48
  • 提问者 慕用4013838 回复 翔仔 #3
    谢谢老师
    回复 有任何疑惑可以回复我~ 2020-06-15 09:40:03
慕沐8221787 2020-06-12 08:06:57

这个问题我回答不了,抱歉,而且同问。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信