[SQL] 내가 키 생성 BIGINT를 배출하면 어떻게됩니까? 어떻게 그것을 처리하기 위해?
SQL내가 키 생성 BIGINT를 배출하면 어떻게됩니까? 어떻게 그것을 처리하기 위해?
내가 여기 물어 생각, 그래서 나는, 자신이이에 대한 좋은 대답을 상상할 수 없다. 내 마음 속에서, 나는 항상 내 MySQL의 테이블의 AUTO INCREMENT PRIMARY ID 열이 배출되는 경우 무슨 일이 일어날 지 궁금하네요?
예를 들어, 나는 두 개의 열이있는 테이블을 말해봐. 이드 (자동 증가 차, BIGINT 부호없는)와 DESC (VARCHAR 255). 나는 확실히 BIGINT 많이 있습니다 알고 있지만 그 한계에 도달 할 수 있습니다. 어떻게 경우에는 ID가 한계에 도달 상기 시나리오를 처리합니까? 나는 다른 서버가 필요하십니까? 다음 경우 어떻게 그것을 동기화 할 수 있습니다? 이것은 올바른 방법인가? 모든 통찰력 친구.
해결법
-
==============================
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.큰 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.자동 증가 필드 크기에 대한 제한을 공격하면, 인서트는 오류가 발생합니다.
자동 증가 필드 크기에 대한 제한을 공격하면, 인서트는 오류가 발생합니다.
실제에서는 오류의 다음과 같은 유형을 얻을 것이다 :
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.대형 데이터 세트 키로 숫자를 증가 사용하지 마십시오. 당신은 암시 적 상한을 가지고 있지만, 그것은 또한 서버가 여러 문제를 야기뿐만 아니라 때문에; 당신은 그들이 증가하기 때문에 중복 된 기본 키를 가지고있는 위험이 있기 때문이다.
대형 데이터 세트 키로 숫자를 증가 사용하지 마십시오. 당신은 암시 적 상한을 가지고 있지만, 그것은 또한 서버가 여러 문제를 야기뿐만 아니라 때문에; 당신은 그들이 증가하기 때문에 중복 된 기본 키를 가지고있는 위험이 있기 때문이다.
당신은 MySQL의에이 한계에 도달하면,이 같은 암호 같은 오류가 발생합니다 :
Error: Duplicate entry '0' for key 1
그것의 더 나은 고유 ID 또는 생성하는 몇 가지 다른 순서를 사용합니다. MySQL은 시퀀스를 지원하지 않지만, PostgreSQL는 않습니다.
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
'SQL' 카테고리의 다른 글
[SQL] 어떤 변화에 오라클 ROWID를 일으킬 수 있습니다? (0) | 2020.06.07 |
---|---|
[SQL] 안드로이드 이클립스 디버그 모드에서 SQL 데이터베이스를 보는 방법 (0) | 2020.06.07 |
[SQL] C #을 통해 ado.net를 사용하여 SQL Server 데이터베이스에 값을 삽입 (0) | 2020.06.07 |
[SQL] 왜 집계 함수는 where 절에서 허용되지 않습니다 (0) | 2020.06.07 |
[SQL] 내가 SUM을 사용하는 방법 () OVER () (0) | 2020.06.07 |