从开发者角度谈Mysql主键

转载自 从开发者角度谈Mysql主键

说在前面

零度mysql一直比较薄弱,俗话说的好,不会mysql的程序员不是好程序员,刚刚好认识mysql大牛刘龘刘,刚刚好就有了这些文章,主要是刘龘刘大牛写的,零度稍微修改成文,零度觉得这系列文章非常不错,可以从开发者角度看看mysql。

主题

  • 使用自增主键的好处

  • 使用非自增主键坏处

  • 总结

使用自增主键的好处

那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页

使用非自增主键坏处

由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

总结

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

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

  • 该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;

  • 如果一个InnoDB表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。



猜你喜欢

转载自blog.csdn.net/moakun/article/details/80222407