2017-01-16 2 views
0

을위한 차선의 최대 ID를 선택해 나는 Shard11- 500 사용자를 가지고 있으며, shard2 등등 501-1000 사용자와를 가지고 의미 MySQL의 즉더 나은 방법 파편

--------------------- 
shard | upperbound 
--------------------- 
1  | 500 
2  | 1000 
3  | 1500 

에서 범위 기반 파편에 대한 사용 사례가 있습니다. 사용자 기반의 후자가 커지면 새 샤드를 추가 할 것입니다. 아래와 같이

사용자 테이블이 보인다 :

----------------------------- 
id | name | email | contact 
----------------------------- 
1 |Test |[email protected]|xxxxx 
501 |Test1 |[email protected]|xxxxx 
101 |Test2 |[email protected]|xxxxx 
1001 |Test3 |[email protected]|xxxxx 

그래서 이름 Test와 사용자가 shard1에있는, 이름 test2을 가진 사용자는 shard2에있는 이름 Test3을 가진 사용자는 등등 shard3과에 있습니다. open shards을 바탕으로

새 사용자 등록이 발생

은, 그것은 먼저 select on the user table with range 1 저장을하여 next max possible Id 및 증가를 얻기 위해 수행 (Shard4 및 Shard5 등록 열려 있습니다)라고 할 수 있습니다. 이 접근법의 문제점은 서로 다른 두 사람이 등록하려고 시도 할 때 코드 select에서 두 사람/스레드에 대해 동일한 ID를 반환 할 때 사용자 등록이 모두 동일한 트랜잭션에있을 수 없기 때문입니다.

next id for a shard using range을 선택할 수있는 더 좋은 방법이 있습니까?

+0

옵션으로 선택 및 삽입하지 않고 SP (저장 프로 시저)를 사용할 수 있습니다. Sp는 그것을하고 이드를 돌려 보낼 것입니다. –

+0

@MaheshMadushanka : SP가 어떻게 갈 것인가를 어떻게 알 수 있을까요? 나는 어떤 범위를 돌보고, 어떻게 샤드 풀을 처리 할 것인가? 나는 mysql에서 가난하다. 샘플 참조가 실제로 도움이된다. –

+0

최대 ID를 가져오고 새 증분 값을 저장하는 사이에 사실상 * 시간이 없음을 확인할 수 있다면 문제의 확률이 크게 줄어든다. SP를 사용하거나 직접'select'와'insert' statemets *를 보내서 확실하게 확인할 수 있습니다. – cars10m

답변

0
select max(id) from t for update 

트랜잭션이 완료 될 때까지 최대 ID에서 잠금을 유지해야합니다.