2009-02-04 5 views
11

Gmail에서 볼 수있는 URL 아이디와 비슷한 16 진수 값을 비즈니스 키 (기본 키로 자동 증가 필드 외에도)로 구현할 응용 프로그램을 만들고 있습니다. . 나는 컬럼에 고유 한 제한 조건을 추가하고 원래 varchar 필드 검색에서 벗어나기 위해 bigint 값을 저장하려고 생각했지만이 필드가 고유한지 여부가 궁금합니다.고유 한 varchar 필드와 고유 bigint의 MySQL 성능

내부 조인은 자동 증가 필드를 사용하여 수행되며 16 진 값은 필터링을 위해 where 절에 사용됩니다.

정수로 값을 저장하기 위해 hex와의 변환을 수행하는 추가 작업에 varchar (x) 또는 char (x) 값을 저장하는 것만으로 어떤 종류의 성능이 저하 될 수 있습니까? 데이터베이스에? 추가적인 복잡성의 가치가 있습니까?

소수의 행 (50k)에 대한 빠른 테스트를 수행했으며 비슷한 검색 결과 시간을 가졌습니다. 큰 성능 문제가 있다면 그것은 선형입니까, 아니면 기하 급수적입니까?

저는 InnoDB를 엔진으로 사용하고 있습니다.

답변

5

16 진수 값은 GUID입니까? 인덱스와 같은 긴 항목의 성능에 대해 걱정 했었지만 현대 데이터베이스에서 수백만 레코드의 성능 차이가 상당히 미미하다는 것을 발견했습니다.

잠재적으로 더 큰 문제는 인덱스가 소비하는 메모리 (예 : 16 바이트 대 4 바이트 int)이지만 제어하는 ​​서버에서는 할당 할 수 있습니다. 인덱스가 메모리에있을 수있는 한 다른 작업에서 인덱스 요소의 크기가 눈에 띄는 차이를 만들지 않는 오버 헤드가 있음을 알게되었습니다.

위의 경우 GUID를 사용하면 생성 된 레코드에 대해 서버 독립성을 얻게되며 여러 서버에서 데이터를 병합하는 데 유연성이 생깁니다.이 시스템은 하위 시스템의 데이터를 집계하므로 걱정 스럽습니다. 내 의심 백업하는 것이 문서에 대한 그래프가

: 16 진수 값은 UUID (자바의 구현)에서 생성됩니다 Myths, GUID vs Autoincrement

1

가; 해시되고 더 작은 길이 (가능하면 16 자)로 잘립니다. 알고리즘은 아직 논의 중입니다 (현재 SHA). 16 진수 대 정수 값을 저장하는 장점은 크기를 늘릴 필요가 있다면 (16 진수로이 응용 프로그램에서 발생하는 것을 볼 수 없음) 단순히 잘라진 길이를 늘리고 두려움없이 이전 값을 그대로 둘 수 있다는 것입니다 충돌의. 정수 값으로 변환하는 것은 멋지게 작동하지 않습니다.

간단하게 GUID/UUID를 사용하는 이유는 단순히 URL과 API를 더 친숙하게 만드는 것입니다.

+1

개인적으로 나는 실제로 피하려고합니다. 사용자 인터페이스의 GUID에 사용자를 표시합니다. 심지어 URL 줄. 그러나, 나는 그들을 내부적으로 사용하고 세션 *을 사용하거나 특정 코드를 사용하여 디스플레이 *를 잘라내는 것이 좋습니다. 그런 식으로 & item = 1이 내가 보여준 첫 번째 항목입니다 ... 내부적으로 GUID *를 가져옵니다. – Godeke

1

다른 모든 요소가 동일하면 데이터를 작게 유지하면 실행 속도가 빨라집니다. 대부분 디스크 공간이 적어 디스크 I/O가 적어 지므로 인덱스 등을 저장하는 데 필요한 메모리가 적어지기 때문에 50k 행으로 충분하지 않습니다.