为什么建议在InnoDB中使用自增主键?

一、减少页分裂

搜索了下网上关于这个问题的回答,基本上都有一条是围绕减少页分裂的情况回答的。

但是我觉得大部分的文章写的大笼统,让人摸不着头脑,为啥会减少页分裂?我这里说下我的理解。

1、插入时减少页分裂,要变相的看。如果你的插入是无序的(不设置自增id),在一个数据页即将到达阈值时,若要插入的数据在当前数据页内,就会导致页分裂(这样看起来还好,因为超过阈值总归要进行分裂,问题在于分裂之后),分裂之后两个数据页中的数据还是有很大的间隙,如果接着往其中一个页插入数据,可能很快又会达到阈值,继续触发分裂。
例如:

  • 无自增主键:
    要插入100条数据,每页的阈值是50条(实际上阈值不是根据条数设置的,是根据存储空间设置的,这里只是举例);
    在插入第51条时,触发页分裂,第1号页有25条,2号页有26条;如果继续往2号页中插入数据(因为是无序的所以主键之间可以有很大的间隙),插入25条后又会触发页的分裂。

  • 有自增主键:
    要插入100条数据,每页的阈值是50条;
    在插入第51条时,触发页分裂,第1号页有50条,2号页有1条;如果继续插入25条数据,此时不会发生页分裂,因为没有达到2号页的阈值。

2、实际上在InnoDB中由于顺序自增导致页分裂时,只有第一次分裂是从中间进行平分给两个数据页;之后由于在尾部添加数据导致的页分裂只会将要增加的数据放到新页上(我这里说的有点绝对,但是不影响我要表述的结果。实际上在尾部增加数据导致超过阈值触发页分裂时,要看连续增加的方向和当前的增加方向,如果不理解请忽略,想了解的看下InnoDB的页的Page Header就理解了);这样减少了数据的移动。

3、当然任何事物都要辩证的看待,不是说所有的业务表都要加自增主键,要运用现有的知识去判断该不该加,加了之后我有哪些优缺点,不加有哪些优缺点。

二、减少二级索引的存储空间

二级索引只保存了数据项的主键,所以理论上主键越小二级索引占用的存储空间越小,每个索引页存储的数据行越多,cache命中率越高。
但是一般设置自增主键时都要求:无符号、自增。这样的主键占用8个字节,如果你的业务键小于8个字节,用业务键为主键的话,其实更划算。所以要视情况而定。

三、锁相关

理论上间隙锁可以重入,不会影响插入效率。和锁相关的问题我还没想明白,想明白了再补充吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值