기초공부 - (12) Com_update 와 duplicate key update

2024. 4. 22. 23:04MySQL/Class

반응형

insert .. on duplicate key update 가 실행되는 마스터에서 Com_update 수가 마스터에서는 증가하지 않으나 슬레이브에서 급속도록 증가하고 있어서 해당 부분을 찾아 보게 되었습니다.

아래도 여러번 말을 하겠지만, duplicate key update 문 때문에 헷갈리게 된 바보같은 내용일 수도 있을 것 같습니다. 

 

예제를 본다면 훨씬 이해가 편할 겁니다.

time
(Seq)
Master Slave
1 create table member (
    name varchar(10),
    num int,
    reg_date timestamp,
    upt_date timestamp,
    primary key(name));
 
2 show global status where variable_name in ('Com_select',Com_insert','Com_update','Questions');
 
3
4 insert into member values('soccer',1,now(),now())
on duplicate key update
num=num+1,
upt_date=now();
 
5

- Com_insert가 증가하였습니다.
 
6 - 데이터 확인
- 데이터 확인
7  

- 데이터 동기화를 하면서 내부적으로 insert를 하여 Com_insert가 증가한 것으로 보입니다.
8 -  동일 쿼리를 다시 한번 날려봅니다. 여기서는 데이터가 존재하기 때문에 update 가 작동하여, num값이 2로, upt_date값이 갱신될 것입니다.
insert into member values('soccer',1,now(),now())
on duplicate key update
num=num+1,
upt_date=now();


9

- Com_update가 아닌 Com_insert 가 증가하였습니다.
- 이것은 insert쿼리라서 update 쿼리라고 인식하지 않은 것 같습니다.
 
10 - 데이터 확인(num과 upt_date 가 변경되었습니다.)
 
11   - 데이터 확인(master와 동일합니다.)
12  

- Com_update가 증가하였습니다.
- 기존 데이터가 존재하기 때문에 동기화 작업을 하면서 내부적으로 업데이트를 진행한 것으로 보입니다.

 

master 는 Com_insert가 증가하였지만, slave는 Com_update 가 증가 하였습니다.

이것은 insert 구문에 duplicate key update 때문에 혼란을 가져다 줄 수 있을 것 같습니다.

 

처음에는 별에별 생각을 많이하게 되었습니다.(저는 이런 생각도 했습니다.)

슬레이브는 업데이트가 작동했는데 마스터는 왜 insert인가?
마스터에 들어가면서 슬레이브에 동기화 시키고 데이터가 존재하기 때문에 업데이트를 한번더 한게 아닌가?
그렇다면 업데이트를 하면서 값이 2배로 증가되는 게 아닌가?

 

결론을 말씀드리자면

master 는 발생된 insert 쿼리로 인해 Com_insert 가 증가한것이 맞습니다.

 

여기서 왜 slave는 Com_update 가 증가한 것이냐 였습니다. 계속 insert 쿼리랑 엮어서 생각 했던것이 문제였습니다.

slave는 마스터의 binlog를 보고 데이터 동기화를 하기 때문에 insert 쿼리랑은 전혀 무관합니다.(binlog_format=row)

 

즉, slave는 쿼리가 어떤것인지 상관없이 binlog를 보고 동기화를 하기 때문에, Com_update, Com_insert 등 모든 것이 내부적인 작동에 의해서 결정 되는 것입니다.

 

너무 당연한 얘기를 어렵게 풀어서 얘기를 한게 아닌가 싶지만, 개인적으로 com_insert, com_update 에 대해서 좀 더 알아보는 시간을 갖게 되어 많은 도움이 되었다고 생각합니다.^^

 

 

반응형