MySQL UUID() 函数

嘿,UUID,我必须告诉你我当时陷入的陷阱。

2 01 4 年,我刚刚启动了一个电子商务项目,使用MySQL作为数据库。
当时我就想到用UUID()函数给订单表添加一个唯一标识符。
我以为这将是世界上独一无二的,绝对不可能复制的,那该多棒啊。

结果是什么?项目上线后不久,我注意到订单号有时会重复。
我一头雾水,查了一下发现是MySQL主从复制的原因。

想一想:主库生成一个 UUID,例如例如。
1 2 3 e4 5 6 7 -e8 9 b-1 2 d3 -a4 5 6 -4 2 6 6 5 5 4 4 0000,然后通过Mysqldump导出数据,然后从从库导入。
这个过程有一个延迟。
从库可能还没有同步,主库生成了相同的UUID。
然后重复。

后来了解到前三组UUID是根据时间戳生成的,但是第四组是随机生成的,可能会导致重复。
另外,重启MySQL服务器后,第四组的生成算法发生变化,增加了重复的风险。

所以如果你使用UUID()函数并且你的场景是主从复制,那么你需要特别注意复制模式。

例如,使用STATMENT模式时,UUID的不确定性可能会导致主从不一致。
为此,我半夜起来,调整了好久的协议,才终于发现了问题所在。

在MIXED或ROW模式下,复制的UUID值保持一致,保证数据一致性。
因此,在使用复制时,建议使用MIXED或ROW模式。

另外,MySQL 5 .1 之后引入的UUID_SHORT()函数生成6 4 位整数,但server_id必须在0到2 5 5 之间并且不支持STATEMENT模式。
这个功能我用的不多,因为场景很少。

总之,UUID如果使用得当,是一个神奇的工具,但如果使用不好,它就会愚弄人。
只有了解生成机制和复制模式,才能避免陷入陷阱。

怎么向mysql导入数据的同时在主键列自动生成uuid?

直接给出结论。

方法一:在SQL语句中输入UUID函数。
广场 插入用户(id,名称)值(UUID(),'Alice'),(UUID(),'Bob');
时间:2 02 3 年1 0月2 7 日。
位置:MySQL数据库 某些数字:表名user、列名id和name。
方法2 :创建触发器。
广场 创建触发器 user_before_insert 输入用户之前 对于每一行 SET NEW.id = UUID();
时间:2 02 3 年1 0月2 7 日。
位置:MySQL数据库 具体数字:表名user,触发器名user_before_insert。

两种方法都有效。

在MySQL中生成唯一分布式ID的多种方案与对比(UUID, Snowflake)

是的,这就是问题所在。
有多种 ID 创建选项,您选择哪一种取决于您的需要。

UUID简单、成本低,但它是非结构化的,占用空间大,所以适合少量记录。

Snowflake性能良好且组织良好,但实现复杂,适合高并发。

自动递增数据库+步长很简单,但它依赖于数据库并且难以扩展。

Redis自身增长速度较快,但依赖于Redis,重启有风险。

选择解决方案时,首先考虑性能,然后考虑规律性,最后考虑可用性和复杂性。

小型系统使用UUID,大型系统使用Snowflake或Redis。

监控是关键,使用Prometheus和Grafana实现数据可视化并保证稳定性。
你自己看看吧。