gpt4 book ai didi

mysql - 如何加速我的 MySQL UUID v4 存储函数?

转载 作者:可可西里 更新时间:2023-11-01 06:43:16 25 4
gpt4 key购买 nike

我正在尝试编写一个 MySQL 存储函数来生成 v4 UUID,如 RFC 4122 的第 4.4 节 (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 或存储过程,我也很乐意听到。

最佳答案

我没有测试它的正确性或性能。这只是做一个连接而不是两个连接的想法。

create function uuid_v4()
returns binary(16)
begin
set @h1 = lpad(hex(floor(rand() * 4294967296)), 8, '0');
set @h2 = lpad(hex(floor(rand() * 4294967296)), 8, '0');
set @h3 = lpad(hex(floor(rand() * 4294967296)), 8, '0');
set @h4 = lpad(hex(floor(rand() * 4294967296)), 8, '0');

set @uuid = concat(
@h1,
substr(@h2 from 1 for 4),
'4',
substr(@h2 from 6),
substr('ab89' from floor(1 + rand() * 4) for 1 ),
substr(@h3 from 2),
@h4
);
return unhex(@uuid);
end
;

另外,为什么要在函数中使用 READS SQL DATA

关于mysql - 如何加速我的 MySQL UUID v4 存储函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com