Programing

UUID를 숫자로 저장하는 방법은 무엇입니까?

lottogame 2020. 10. 22. 07:37
반응형

UUID를 숫자로 저장하는 방법은 무엇입니까?


질문에 대한 답변 인 MySQL의 UUID 성능 에 따라 답변 하는 사람은 UUID를 문자열이 아닌 숫자로 저장하도록 제안합니다. 어떻게 할 수 있는지 잘 모르겠습니다. 누구든지 나에게 뭔가를 제안 할 수 있습니까? 내 루비 코드가 어떻게 처리합니까?


올바르게 이해했다면 기본 열에서 UUID를 사용하고 있습니까? 사람들은 일반 (정수) 기본 키가 더 빠를 것이라고 말할 것이지만 MySQL의 어두운면을 사용하는 또 다른 방법이 있습니다. 실제로 MySQL은 인덱스가 필요할 때 다른 어떤 것보다 바이너리를 사용하는 것이 더 빠릅니다.

UUID는 128 비트이고 16 진수로 작성되기 때문에 UUID의 속도를 높이고 저장하는 것은 매우 쉽습니다.

먼저 프로그래밍 언어에서 대시를 제거하십시오.

에서 110E8400-E29B-11D4-A716-446655440000110E8400E29B11D4A716446655440000.

이제 32 자입니다 (MD5 해시처럼 작동 함).

BINARYMySQL 의 단일 크기는 8 비트 이므로 BINARY(16)UUID의 크기입니다 (8 * 16 = 128).

다음을 사용하여 삽입 할 수 있습니다.

INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))

다음을 사용하여 쿼리합니다.

SELECT HEX(FieldBin) AS FieldBin FROM Table

이제 프로그래밍 언어에서 원래 UUID와 일치하도록 9, 14, 19 및 24 위치에 대시를 다시 삽입하십시오. 위치가 항상 다른 경우 해당 정보를 두 번째 필드에 저장할 수 있습니다.

전체 예 :

CREATE TABLE  `test_table` (
    `field_binary` BINARY( 16 ) NULL ,
    PRIMARY KEY (  `field_binary` )
) ENGINE = INNODB ;

INSERT INTO  `test_table` (
    `field_binary`
)
VALUES (
    UNHEX(  '110E8400E29B11D4A716446655440000' )
);

SELECT HEX(field_binary) AS field_binary FROM `test_table`

16 진수 문자열에이 기술을 사용하려면 항상 length / 2필드 길이를 사용하십시오. 따라서 sha512의 BINARY (64)경우 sha512 인코딩 길이가 128 자이므로 필드가 됩니다.


Percona 블로그에는 귀하의 질문에 답하는 기사 (벤치 마크 포함)가 있습니다. 최적화 된 방식으로 UUID 저장 .


바이너리를 사용하는 것이 좋은 생각이라고 생각하지 않습니다.

어떤 값을 쿼리하고 싶다고 가정 해 보겠습니다.

SELECT HEX(field_binary) AS field_binary FROM `test_table`

여러 값을 반환하는 경우 HEX 함수를 여러 번 호출합니다.

그러나 주요 문제는 다음 문제입니다.

SELECT * FROM `test_table`
    where field_binary=UNHEX('110E8400E29B11D4A716446655440000')

그리고 where 내부의 함수를 사용하면 단순히 인덱스를 무시합니다.

또한

SELECT * FROM `test_table`
    where field_binary=x'skdsdfk5rtirfdcv@#*#(&#@$9' 

많은 문제를 일으킬 수 있습니다.

참고 URL : https://stackoverflow.com/questions/10950202/how-to-store-uuid-as-number

반응형