테이블의 필드가 최대 부호있는 또는 부호없는 32 비트 정수에 접근 할 때 어떻게해야합니까?


14

고유 한 자동 증분 필드의 형태로 사용자 레코드를 보유하는 모든 데이터베이스에서 (예를 들어, 사용자 간 메시지) ... 시간이 다가오고 최대 부호 또는 부호가없는 수에 접근 할 때 수행 할 작업 현재 데이터 유형의 (32 비트 INT)? 나는 데이터베이스 서버가 (2 to32) -1 번호를 다음 항목에 할당하려고 할 때 오버플로 될 것이라고 추측하고 있습니다. 계속 레코드를 추가 하시겠습니까? 당신은 무엇을 하시겠습니까?

VARCHARS와 같이 INT를 사용하는 이유는 무엇입니까?

내가이 가상의 질문을한지 며칠이 지났고 전문가가 무엇을하는지 알고 싶습니다.

답변:


12

일반적으로 varchars보다는 정수를 사용합니다. 공간을 덜 소비하고 정렬 패턴이 색인 생성 속도가 빠르다는 것을 잘 알고 있기 때문입니다. 정수는 CPU의 자연스러운 데이터 유형이므로 성능이 일반적으로 최적입니다. 일반적으로 정수는 4 바이트이며 유니 코드가 아닌 varchar의 4 자에 해당합니다.

INT 유형의 공간이 부족 할까 걱정되면 8 바이트 숫자를 제공하는 BIGINT를 시도하십시오. 이것에 대한 한계는 상당히 커서 레코드 한도에 도달하기 전에 디스크 공간이 부족할 수 있습니다.-) 특히 많은 서버가 64 비트이므로 BIGINT의 성능도 매우 좋아질 것입니다. .

INT가 부족할 때 발생하는 문제에 대한 질문의 첫 번째 부분에 대한 대답은 간단하지 않습니다. 특히 데이터 유형을 BIGINT로 변경하지 않고 말한 것처럼 간단합니다. 기본적으로 수행 할 수있는 작업이 많지 않으며 수행 할 수있는 작업은 데이터베이스의 데이터 특성에 따라 제한됩니다. 이 데이터에 외래 키가있는 레코드는 무엇입니까? 해당 테이블의 모든 데이터와 관련 레코드가 여전히 필요합니까? 많은 초기 데이터 (및 관련 데이터)를 아카이브 할 수 있다고 가정 할 때 제안 할 수있는 유일한 것은 데이터를 테이블 밖으로 옮기는 것입니다 (첫 번째 1 ~ X 백만 레코드라고 말하십시오). ID 시드를 1로 재설정합니다. 권장하지는 않지만 모든 종류의 이유가 있습니다. 예를 들어 id 필드의 최대 값을 확인하는 것과 같은 일을하는 많은 코드가 있습니다. 방금 추가 된 내용을 확인하면 작동하지 않으며 수행하지 않아야합니다. 또한 사람들은 N + 1 이전에 레코드 N이 생성되었다고 가정합니다. 쉬운 대답은 없다고 생각합니다.

마지막으로 MySQL에 대해서는 잘 모르지만 한계에 도달하면 SQL Server에서 오버플로 오류가 발생합니다.


1
자세한 답변에 만족합니다. VARCHAR, INT 및 BIGINT 거래에 대한 설명에 감사드립니다. 이 질문은 가설이기 때문에 BIGINT 한도에 도달하면 어떻게 될지 궁금합니다. INT를 사용하고 한계에 도달하는 페이스 북에 대해 본 게시물에서 질문이 제기되었으며 완전히 가능하다고 생각합니다. 아카이브는 작동하거나 조건문을 사용하여 두 번째 테이블을 작성합니다 (말한 것처럼 스크립트도 업데이트해야하며 매우 복잡합니다). 전반적으로 좋은 대답입니다. 시간을 내 주셔서 감사합니다.
AeroCross

9

간과 된 점 중 하나는 많은 사람들이 1에서 자동 번호 또는 ID를 시작하여 가능한 범위의 절반을 즉시 잃어 버린다는 것입니다 (서명 된 경우)

이 경우에는 -1에서 시작하여 -1 씩 증가하도록 숫자를 재정의하면됩니다.

신원 열을 채울 것으로 예상 한 경우에는이를 설계하고 처음에 더 넓은 데이터 유형을 사용해야합니다.

SO : SQL Server 2008 : ID가 최대 int 값을 초과하면 어떻게됩니까?


논리적으로 더 넓은 데이터 형식을 사용하지만 (데이터의 양을 계산하는 테이블의 경우) 가상의 질문이므로 통찰력을 원했습니다. 서명 된 경우 작동 할 수 있지만 (IMHO가 음수 인 기본 키를 갖는 것은 조금 이상 할 것입니다) 꽤 영리하다고 생각합니다. DBA가 긍정적 인 데이터를 보관하고 다시 시작하는 데 시간이 걸립니다. 서명하지 않으면 문제는 ...
AeroCross

-1에서 -1 증분을 사용하는 대신 (-2147483648)에서 시작하여 1 씩 증가합니다. 그렇습니다. INT_MAX를 교차 한 후에는 꽤 잘 연결되어 있고 디자인을 다시 방문하여 기존 인덱스를 제거해야합니다. 더 큰 새로운 것. 그리고 서명하지 않은 BIGINT를 통과하면 팀에서 일하고 싶습니다.)
jcolebrand

PostgreSQL은 시퀀스를 사용하여 ID 번호를 생성합니다. CREATE SEQUENCE 문을 사용하면 CYCLE을 지정할 수 있으며 최대 값에 도달하면 랩핑됩니다. (또는 다른 방향으로 가고 있다면 최소값입니다.) CYCLE 옵션은 이제 SQL 표준에 있습니다. (최소한 2003 년 이후)
Mike Sherrill 'Cat

4

오버 플로우 BIGINT? ㅋ. 먼저 불멸을 달성하는 방법을 알아 내십시오. INT UNSIGNED (40 억)는 도달하기에 충분하지 않습니다. 초당 100 개의 INSERT가 1 년 동안 INT가 넘치게됩니다. BIGINT는 수십억 년이 걸릴 것입니다.

수정하려면 : ALTER TABLE foo MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT; 그러나 약 40 억 행에 가까운 테이블을 복사하고 모든 보조 인덱스를 다시 작성하기 때문에 시간이 걸립니다. 계획 Ahea d.

일반적으로 필드에 너무 큰 숫자 (예 : TINYINT UNSIGNED의 999)를 저장하려고하면 필드의 최대 값 (이 경우 255)으로 자동으로 제한됩니다. "경고"가있을 수 있지만 대부분의 사람들은 경고를 확인하지 않습니다. 고유 필드이거나 FOREIGN KEYS가 있으면 더 심각한 오류가 발생할 수 있습니다.

CHAR 또는 VARCHAR이 사용 가능한 공간으로 자동으로 잘립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.