美文网首页
Mysql-InnoDB自增索引问题

Mysql-InnoDB自增索引问题

作者: 梦想又照进现实 | 来源:发表于2019-07-21 16:52 被阅读0次

    InnoDB需要显式设置自增主键

    如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:

    1、使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;

    2、该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;
    除此以外,如果一个InnoDB表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。

    设置自增隐含的问题:

    1、InnoDB类型的数据表将表最后的ID值保存在内存里面。所以,当我们重新启动服务器后,内存里面的数据清空,那么自增的ID将重新按照现有表的纪录计算;相反,如果是MyISAM类型的数据表,将最大纪录ID保持在文件里,这样,虽然,重启了服务器,下次插入新纪录的时候,自增ID通过读取文件而计算得到。

    解决上面问题方案是:做软删除,保持自增id主键值的连续性;

    2、自增主键在新老系统数据做同步、对接时候保持值不冲突会是个问题;

    3、做分库分表时候分片上的不能再自增,否则会造成多分片上数据主键重复;

    不设置自增主键问题

    备库hang住风险:
    表中没有主键,导致了每一个事务条目的更新都是全表扫描,如果表中很很多的数据,则备库执行该更新的事务条目的时候,就会出现很多的全表扫描更新,导致slave出现hang住的情况。

    总结:主键对于innodb来说,是非常重要的,每张表的设计的时候,都应该把主键默认的加上,不管你需不需要他,而且主键的设计最好选择自增型的主键;

    这里也可以略提一下自增主键的好处:
    a.自增型主键以利于插入性能的提高;
    b.自增型主键设计(int,bigint)可以降低二级索引的空间,提升二级索引的内存命中率;
    c.自增型的主键可以减小page的碎片,提升空间和内存的使用。

    推荐书籍:

    《高性能MySQL》

    相关文章

      网友评论

          本文标题:Mysql-InnoDB自增索引问题

          本文链接:https://www.haomeiwen.com/subject/nufvlctx.html