我正在尝试编写一个MySQL存储函数来生成RFC 4122第4.4节中描述的v4 UUID(http://www.ietf.org/rfc/rfc4122.txt)。经过一些调整后,我的初始努力如下:
CREATE FUNCTION UUID_V4()
RETURNS BINARY(16)
READS SQL DATA
BEGIN
SET @uuid = CONCAT(
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' ),
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' ),
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' ),
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' )
);
SET @uuid = CONCAT(
SUBSTR( @uuid FROM 1 FOR 12 ),
'4',
SUBSTR( @uuid FROM 14 FOR 3 ),
SUBSTR( 'ab89' FROM FLOOR( 1 + RAND() * 4 ) FOR 1 ),
SUBSTR( @uuid FROM 18 )
);
RETURN UNHEX(@uuid);
END
上述函数非常慢:根据MySQL的BENCHMARK()特性,几乎比内置的UUID()函数慢了100倍。除了使用MySQL的C API编写UDF之外,我还能做出哪些改进来缩短其运行时间?
如果已经存在一个广受好评的UUID UDF或存储过程,我也很乐意听听。
UUID()
并不按照RFC4122生成UUID,而它生成的方式会破坏基于语句的复制。 - Richard Simões