Как я могу ускорить мою сохраненную функцию MySQL UUID v4?

Я пытаюсь написать хранимую функцию MySQL для генерации UUID v4, как описано в разделе 4.4 RFC 4122 ( 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

Вышеупомянутая функция довольно медленная: почти в 100 раз медленнее, чем встроенный UUID () , согласно MySQL BENCHMARK () функция. Если не считать написания UDF с использованием MySQL C API, могу ли я внести здесь какие-либо улучшения, чтобы, скажем, на порядок сократить время его выполнения?

Если существует уже существующий, хорошо известный UUID UDF или хранимая процедура , Я тоже буду рада услышать об этом.

6
задан Richard Simões 8 July 2011 в 13:40
поделиться