MySQL 水平拆分之后,自动增长的ID有什么好的解决办法?
黄舟
黄舟 2017-04-17 15:04:12
0
5
801

当单表的数据量过大时,会采用MySQL进行水平拆分,请问原先的自动增长的ID有什么好的解决办法?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(5)
大家讲道理

수평 분할 후에는 동일한 테이블의 데이터가 서로 다른 라이브러리에 배치됩니다. 여러 라이브러리 간에 생성된 ID 고유성을 달성하기 위해 더 이상 데이터베이스 자체의 auto_increment에 의존할 수 없습니다. 갈등을 야기합니다.
그렇다면 데이터베이스에서 ID를 할당하면 안 되는데, 무엇을 할당해야 할까요?

  • 애플리케이션이 데이터베이스 미들웨어를 통해 백엔드 MySQL에 액세스하는 경우 ID는 미들웨어에서 생성되어야 합니다

  • 미들웨어가 없으면 애플리케이션에서 ID를 생성합니다

하지만 애플리케이션이든 미들웨어이든 분명 여러 애플리케이션(여러 클라이언트)이 있을 것이고 미들웨어, 미들웨어는 일반적으로 단일 인스턴스를 배포하지 않으므로 단일 포인트 문제가 발생합니다( 단일 실패 지점), 미들웨어는 프로덕션 환경의 클러스터에 배포됩니다.

그러면 문제는 훨씬 더 명확해질 것입니다. 위의 상황 중 실제로 필요한 것은 글로벌 ID 생성기입니다.

글로벌 생성기는 다양한 방법으로 구현될 수 있습니다

  • 공개 데이터베이스에서 ID 받기

  • Zookeeper 클러스터에 ID 생성 전략을 넣고 Zookeeper 클러스터에서 글로벌 ID를 얻습니다

이것이 기본 전략입니다. 작은 세부 사항이 하나 더 있습니다.

전역 ID는 테이블으로 나누는 것이 가장 좋습니다. 하나의 테이블은 전역 ID 컨텍스트에 해당하고, 다른 테이블은 다른 전역 ID 컨텍스트로 이동합니다.

또 다른 점은 미들웨어든 애플리케이션이든 전역 ID를 가져올 때 한 번에 하나만 가져오지 마세요 더 좋은 방법은 입니다. 매번 ID 섹션을 가져옵니다. 예를 들어 애플리케이션 1에서 가져옵니다. ID 1-50을 얻은 경우 50개의 ID가 모두 사용되기 전에 더 이상 ID를 얻을 필요가 없습니다. 애플리케이션 2도 ID를 얻으면 ID 51-100을 얻게 됩니다. 비트 겨울용 음식을 저장하는 것과 같습니다.

Ty80

현재 알려진 방법:
1. 원래 자동 증가 열을 자동 증가가 아닌 기본 키로 수정합니다. 기본 키를 직접 관리하세요

2. 수평 분할은 기존 데이터를 분할하는 것을 의미하며 분할 테이블의 데이터는 변경되지 않음을 의미합니다. 새로 추가된 데이터는 계속해서 자동으로 추가됩니다. (자동 증가 및 공백 ID는 설정할 수 없습니다.)

3. 통일된 알고리즘을 만들어 보세요. 자동으로 유지되는 대신 자동 증가 ID를 계산하고 작성해야 합니다

伊谢尔伦

이전에 그런 필요가 있었던 적이 있습니다.
처리 방법은 다음과 같습니다. 기본 키 열의 자동 증가를 제거하고, redis의 증가를 통해 자동 증가 시퀀스 값을 생성하고, 삽입 시 ID 값을 지정합니다.

刘奇

1. 테이블과 저장 프로시저를 사용하여 ID 자동 증가 기능을 작은 모듈로 만듭니다.

2. 분할 테이블에 데이터 INSERT가 있는 경우 이 저장 프로시저가 호출되어 새로운 ID를 적용합니다.

迷茫

테이블을 분할한 후 기본 키를 직접 생성하는 것이 가장 좋습니다. 트위터의 눈송이 등 오픈 소스 기본 키 생성 전략 알고리즘이 많이 있습니다.
프로그램 변경을 원하지 않으면 설정하세요. 각 클러스터의 자동 증가 ID 시작점(auto_increment_offset) 및 ID 자동 증가 단계 크기(auto_increment_increment)는 각 클러스터의 시작점을 엇갈리게 하여 ID를 상대적으로 분할하는 효과를 달성하여 글로벌 고유성을 달성합니다. 장점은 구현이 간단하고 애플리케이션에 투명하다는 점입니다. 단점은 향후 ID 기반으로 라우팅이 이루어지면 확장이 쉽지 않다는 점입니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿