The UUID in MySQL8

本文探讨了UUID作为MySQL主键的优缺点,并介绍了MySQL8中为优化UUID提供的两个内置函数:UID_TO_BIN和BIN_TO_UUID,这些函数解决了UUID长度和顺序问题,提升了插入性能。通过测试,展示了如何使用这两个函数创建和查询UUID主键,使得UUID在数据分片场景下成为更优选择。尽管目前MySQL8尚未提供UUID数据类型,但作者期待未来版本能有进一步改进。
摘要由CSDN通过智能技术生成
问题

记得刚接手项目时,看了下项目里的库表结构,发现表主键都是varchar(36),就问研发,为啥搞个这么长的主键?研发说这个主键是通过java 程序产生的UUID,考虑到以后数据分片不会产生重复。考虑的还是挺周到!但这么长字段做主键也有许多问题:

  • 首先这个主键很长,而主键会自动添加在每一二级索引的后面,这样会导致数据冗余严重,特别是二级索引建多了的情况下,有时会导致索引的数据比表的数据还大!
  • 其次,这样产生UUID是无序的,导致插入性能很差。因为当插入一个数据到B+tree时,系统将这个数据插入到一个合适的位置,这会导致多次IO,而如果数据本身是自增的,那么系统只须将它添加的B+Tree的末端即可,效率要高的多。

因此我还是建议使用整型+auto_increment, 虽然MySQLauto_increment有个众所周知的、历史悠久的bug(这个bug终于在MySQL8的到修复,MySQL8中auto_increment将会被写入redo log 中啦,爽歪歪),但大多数情况下还是可靠的,并且MySQL官方也建议使用auto_incremnet做主键。但它也有问题,就是无法适应数据分片的扩容(分库分表),除非你之前规划的非常好。

MySQL8中的解决方案

如今MySQL8 中对UUID提供了增强性支持,不仅使其长度大大缩小,而且解决了顺序的问题!(我之所以称之为增强性支持,是因为他们提供了两个内置函数做了转换,感觉这种方式有点儿low,这样的函数我们也可以写啊)

大家都知道,UUID是由32位16进制字符串组成(不算分隔符’-‘)如:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值