복붙노트

[SQL] 내가 키 생성 BIGINT를 배출하면 어떻게됩니까? 어떻게 그것을 처리하기 위해?

SQL

내가 키 생성 BIGINT를 배출하면 어떻게됩니까? 어떻게 그것을 처리하기 위해?

내가 여기 물어 생각, 그래서 나는, 자신이이에 대한 좋은 대답을 상상할 수 없다. 내 마음 속에서, 나는 항상 내 MySQL의 테이블의 AUTO INCREMENT PRIMARY ID 열이 배출되는 경우 무슨 일이 일어날 지 궁금하네요?

예를 들어, 나는 두 개의 열이있는 테이블을 말해봐. 이드 (자동 증가 차, BIGINT 부호없는)와 DESC (VARCHAR 255). 나는 확실히 BIGINT 많이 있습니다 알고 있지만 그 한계에 도달 할 수 있습니다. 어떻게 경우에는 ID가 한계에 도달 상기 시나리오를 처리합니까? 나는 다른 서버가 필요하십니까? 다음 경우 어떻게 그것을 동기화 할 수 있습니다? 이것은 올바른 방법인가? 모든 통찰력 친구.

해결법

  1. ==============================

    1.그것은 밖으로 실행되지 않습니다.

    그것은 밖으로 실행되지 않습니다.

    최대 BIGINT는 9223372036854775807입니다. 106,751,991,167일의 가치가 1000 개 삽입시 / 초. 거의 3억년, 내 수학이 옳다면.

    당신이 오프셋을 사용하여, 그것을 밖으로 분할하더라도 경우 100 개 서버는 각각의 값의 전용 하위 범위를 가지고 있다고 (X * 100 + 0 ... X * 100 + 99), 당신이 밖으로 실행하지 않을거야. 10 만 개 삽입하고 10,000 기계 / 초 약 3 세기가 당신을 얻을 수 있습니다. 물론, 그 고체 수백 년의 뉴욕 증권 거래소보다 초당 트랜잭션의 ...

    당신이 생성 된 키의 데이터 유형 크기 제한을 초과 할 경우, 새로운 삽입이 실패합니다. BIGSERIAL와 (이 PostgreSQL을 태그 한 이후) 당신이 볼 수 PostgreSQL의에서 :

    CREATE TABLE bigserialtest ( id bigserial primary key, dummy text );
    SELECT setval('bigserialtest_id_seq', 9223372036854775807);
    INSERT INTO bigserialtest ( dummy ) VALUES ('spam');
    
    ERROR:  nextval: reached maximum value of sequence "bigserialtest_id_seq" (9223372036854775807)
    

    순서는 항상 64 비트이기 때문에 당신이 BIGINT 또는 같은 오류를 얻을 수있는 키 유형을 변경해야 할 위치를 지점에 도달 할 수 있습니다, 그래서 일반 시리얼 위해 당신은, 다른 오류가 발생합니다 :

    regress=# SELECT setval('serialtest_id_seq', 2147483647);
    regress=# INSERT INTO serialtest (dummy) VALUES ('ham');
    ERROR:  integer out of range
    

    말 (shard_id, 하위 키) - - 또는 UUID 키 당신이 진정으로 당신의 사이트가 응용 프로그램에서 BIGINT에 한계에 도달하는 것이 가능하다고 믿는다면, 당신은 복합 키를 사용할 수 있습니다.

    새 응용 프로그램이 처리하려고하는 것은시기 상조 최적화입니다. 진심으로, 성장의 종류에 대한 새로운 응용 프로그램에서 동일한 스키마를 사용하면 될 것인가? 또는 데이터베이스 엔진? 심지어 코드베이스?

    당신은뿐만 아니라 GUID 키 입력 시스템의 GUID 충돌에 대해 걱정할 수 있습니다. 결국, GUID 충돌 가능성이 당신이 생각하는 것보다 있다는 생일 역설 수단 - 믿을 수 없을만큼에, 미친 듯이 가능성.

    배리 브라운 의견에 지적 게다가, 당신은 많은 데이터를 저장하지 않을 것이다. 이것은 단지 미친 듯이 높은 트랜잭션 속도와 높은 이탈 테이블에 대한 우려이다. 해당 테이블에서 응용 프로그램은 단지 제로 키 존재 리셋, 번호가 다시 지정 항목 또는 다른 대처 전략에 대처 할 수 있어야합니다. 솔직히,하지만, 심지어 높은 트래픽 메시지 큐 테이블 밖으로 상단에 갈 수 없습니다.

    보다:

    진심으로, 당신이 다음 Gootwitfacegram을 구축하더라도, 이것은 과거의 방법까지 세 번째 응용 프로그램 재 작성 날짜 사용하기에 의해 문제가되지 않을 것입니다 ...

  2. ==============================

    2.큰 INT는 2 ^ 63 ^ 19 약 10이다. 데이터베이스 벤치 마크는 표준화 된 TPC-C 벤치 마크를 사용하여, 몇 년 전 분노 모두로 사용

    큰 INT는 2 ^ 63 ^ 19 약 10이다. 데이터베이스 벤치 마크는 표준화 된 TPC-C 벤치 마크를 사용하여, 몇 년 전 분노 모두로 사용

    당신은 관계형 데이터베이스에 대한 30,000,000 (분당 3 × ^ 7 거래)의 가장 빠른 관계형 점수를 볼 수 있듯이. 읽고,이 같은 시스템은 분당 30,000,000 행을 쓸 수 있다는 가능성은 매우 낮의 프로필이 많이 포함 있음을 유의하십시오.

    가정 당신이에서 BigInt를 배출하기 위해 약 3 × 10 ^ 11 분 필요합니다,하지만입니다. 6백만년 같은이야 우리가 이해하는 것 시간 측정에서,

    ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
    

    당신이 밖으로 실행하는 경우, 위의 오류 메시지를 받게하고, 기본 키의 GUID를 통해 이동합니다. 128 ^ 2 (천조의 인자에 의해) 그 수보다 작 지구상 디지털 비트가있다.

  3. ==============================

    3.자동 증가 필드 크기에 대한 제한을 공격하면, 인서트는 오류가 발생합니다.

    자동 증가 필드 크기에 대한 제한을 공격하면, 인서트는 오류가 발생합니다.

    실제에서는 오류의 다음과 같은 유형을 얻을 것이다 :

    ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
    

    추가 정보를 보려면 다음 사이트를 방문하십시오

    http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html

  4. ==============================

    4.대형 데이터 세트 키로 숫자를 증가 사용하지 마십시오. 당신은 암시 적 상한을 가지고 있지만, 그것은 또한 서버가 여러 문제를 야기뿐만 아니라 때문에; 당신은 그들이 증가하기 때문에 중복 된 기본 키를 가지고있는 위험이 있기 때문이다.

    대형 데이터 세트 키로 숫자를 증가 사용하지 마십시오. 당신은 암시 적 상한을 가지고 있지만, 그것은 또한 서버가 여러 문제를 야기뿐만 아니라 때문에; 당신은 그들이 증가하기 때문에 중복 된 기본 키를 가지고있는 위험이 있기 때문이다.

    당신은 MySQL의에이 한계에 도달하면,이 같은 암호 같은 오류가 발생합니다 :

    Error: Duplicate entry '0' for key 1
    

    그것의 더 나은 고유 ID 또는 생성하는 몇 가지 다른 순서를 사용합니다. MySQL은 시퀀스를 지원하지 않지만, PostgreSQL는 않습니다.

  5. from https://stackoverflow.com/questions/13132939/what-happens-when-i-exhaust-a-bigint-generated-key-how-to-handle-it by cc-by-sa and MIT license