2009-07-21 4 views
3

Funny thing 나는 abgets mysql을 발견했습니다. MySQL에는 3 바이트 숫자 유형 인 MEDIUMINT가 있습니다. 그 범위는 -8388608에서 8388607입니다. 그것은 나에게 이상하게 보입니다. 성능 향상을 위해 숫자 유형의 크기를 선택 했으므로 데이터가 기계어 나 두 단어로 정렬되어야한다고 생각했습니다. 숫자 범위에 몇 가지 제한 규칙이 필요한 경우 데이터 유형에 대한 상대적인 값이어야합니다. 예를 들면 다음과 같습니다.mysql에서 3 바이트 숫자의 의미 (MEDIUMINT)

CREATE TABLE ... (
    id INT RANGE(0, 500) PRIMARY KEY 
) 

3 바이트를 알면 누구입니까? 어떤 이유가 있습니까?

+0

흥미로운 질문 - 내 upvote 있어요. – M4N

+0

왜 downvote? O_o –

답변

2

언급 한 정렬 문제는 주로 RAM의 데이터에 적용됩니다. MySQL이 3 바이트를 처리하여 그 유형을 저장하도록하는 것은 아무것도 없습니다.

디스크 캐시를보다 효율적으로 사용할 때 이점이 적을 수 있습니다.

+0

예,하지만 최신 프로세서에는 3 바이트 데이터로 작동하기위한 지침이 없습니다. 3 바이트 숫자의 합계를 취할 때 프로세서는 2 개의 4 바이트 수를 제로 플로된 상위 바이트로 더합니다. 이 올바른지? 3 바이트 숫자에서 볼 수있는 유일한 이점은 공간입니다. 대형 데이터 세트에서 3-bte 수는 25 % 더 작아집니다. –

+0

네, 맞습니다. 나는 보통 그 데이터 타입을 사용하지 않을 것이다;) –

9

3 바이트 범위의 숫자가있는 경우 4 바이트를 사용하여 저장하면 공간을 낭비하지 않게됩니다.

200 억 개의 행이있을 때 중요합니다.

+0

공간은 데이터베이스 연산에서 매우 중요하다. – hobodave

+0

이것은 원래 질문의 요점이었던 정렬 질문에 대답하지 않습니다. – Svante

+0

Mehrdad는 다음과 같이 대답했다. – chaos

2

우리는 매우 많은 공간을 절약하기 위해 tinyint, smallintmediumint을 자주 사용합니다. 명심하십시오, 당신의 색인을 훨씬 작게 만듭니다.

id1 smallint unsigned not null, 
id2 mediumint unsigned not null, 
primary key (id1, id2) 

그리고 당신이 기록 수억 또는 수십억을 가지고 : 당신이 좋아, 정말 작은 결합 테이블이있을 때

이 효과는 확대됩니다.

+1

프로세서는 3 바이트 수를 비교할 수 없습니다. 따라서 메모리 인덱스에는 각 인덱스 위치에 4 ​​바이트가 있어야합니다. 중간 크기를 사용하는 경우 인덱스 크기가 3 바이트 길이라는 사실을 알려주시겠습니까? –