前言

以前只知道UUID不适合作为主键,但是不知道具体原因,最近做了了解,在此做一个记录

索引

我们先了解一下mysql索引的数据结构,mysql在innodb的存储引擎下是使用B+树来做为索引的数据结构的,而一个表最终必定会创建一个主键索引,即是没有设置主键也会有生成规则(先查找有没有非空的唯一索引,没有则可以使用默认的rowid字段创建索引)

mysql中存储数据的最小单元称之为page(页),大小为16KB,也就是在索引的结构中一个page存储了很多个数据,可以看上图第一个块存储了1、28、66三个数据

我们知道索引采用B+树的结构后,数据必须是有序的,如果此时page1已经写满,page2写了一半,当下一个数据是有序的时候,则数据将直接追加到page2的末尾。

如果数据是无序的,那么数据可能被插入到page1的某个位置,但是此时page1已经写满了,那么page1中插入数据后面的数据就必须往后移动,存不下的数据就只能放到其他的page,此时就发生了page的分裂和合并,如果此时page2也是写满的,那么将依次影响其他的page,那么将大大影响数据的插入和删除,这就是主键索引不适合使用UUID的原因

主键不适合使用无序字段的原因:
1、无序字段作为索引会导致page的分裂与合并
2、UUID等数据占用字节数太多,而自增的int类型只需要占用4个字节,所有索引最终都会在叶子节点存储主键的id,会导致占用更多的磁盘空间以及降低io性能

MySQL不建议使用UUID作为主键的原因相关推荐

  1. 为什么MySQL不推荐使用uuid作为主键?真香!

    前言 周末花了2天时间学习了额RabbitMQ,总结了最核心的知识点,带大家快速掌握RabbitMQ,整理不易希望帮忙点赞,转发,分享下,谢谢 阿里面试总结 1.一面 首先确认对阿里的意向度:其次面试 ...

  2. Java开发环境!为什么MySQL不推荐使用uuid作为主键

    目录 由于文档内容过多,共计有500页,因此为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的可以在文末获取! 部分内容展示 深入浅出索引(上) 索引的常见模型 InnoDB 的索引 ...

  3. mysql 自动维护uuid_MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路...

    这里使用触发程序实现此功能. 触发程序语法如下: Create trigger {before|after} {insert|update|delete} On For each row 核心代码: ...

  4. 【踩坑记录】mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错

    [踩坑记录]mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错 报错记录 解决方案 推荐方案 使用uuid作为主键,修改id的类型为bigint ...

  5. 生成UUID作为主键

    用UUID作为主键真的很方便,几乎不可能出现重复情况.代码如下: public static String getUUID(){ String s=UUID.randomUUID().toString ...

  6. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)...

    測试缘由 一个开发同事做了一个框架.里面主键是uuid.我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  7. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...

    Reference: https://blog.csdn.net/mchdba/article/details/52336203 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不 ...

  8. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(500W单表)

    测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了说 ...

  9. jpa postgresql 使用uuid作为主键

    UUID @Id@Type(type = "org.hibernate.type.PostgresUUIDType")private UUID id = UUID.randomUU ...

最新文章

  1. [Design] Flyweight Pattern
  2. 《程序员》2007第2期,新产品工具点评 特别推荐“万能数据库查询分析器”发布...
  3. c语言枚举类型例题_[开源资讯]Zig 0.6.0 发布,想要挑战 C 语言
  4. Windows Phone 7开发,进度条ProgressBar使用详解
  5. 自己动手写ORM框架(六):实现查询功能FindById方法
  6. shell的date命令:使用方法,以及小时、分钟的计算
  7. asp.net学习之扩展GridView
  8. java.lang.IllegalArgumentException: Request header is too large 解决方案
  9. MySQL group_concat函数使用详解
  10. 你有结账时发现太贵的尴尬吗?
  11. iOS(iPhone/iPad)开发新手必读
  12. HDU 6599 I Love Palindrome String (回文树+hash)
  13. ModuleNotFoundError: No module named 'pytz'
  14. 【微积分的本质|笔记】直观理解链式法则和乘积法则
  15. Eclipse中文版的,怎么变成英文版
  16. 阿里巴巴入选的JCP最高执行委员会,何方神圣?
  17. RecyclerView 报Scrapped or attached views may not be recycled. as Scrap:false isAttached:true异常
  18. 第二证券|扶持政策频发,教育板块再度爆发,全通教育“20cm”涨停
  19. java log写入txt文件_使用java.util.logging.Logger时如何在文本文件中写日志
  20. FW:Use Log4XX for Logging

热门文章

  1. livy(0.5) on zeppelin(0.8)报No YARN application is found with tag问题解决
  2. ffmpeg和opencv 播放视频文件并显示
  3. Linux声卡驱动移植和测试
  4. Win10 Linux子系统编译Android系统源码
  5. PHP版本微信支付开发----电脑网站扫码支付(native)(心得、总结)
  6. 施耐德电气推出适用于边缘计算的微型数据中心机柜
  7. 单元测试之verify及使用when打桩时对ArgumentMatchers的使用
  8. 图的m色着色问题 回溯法(算法设计与分析)Java
  9. 提高访问量,我用魔盒
  10. linux开机启动动画