티스토리 뷰
대용량 데이터를 일괄적으로 등록을 하거나 수정을 진행할 때 등록인지 수정인지를 우선 체크해야 하는 경우가 있다.
간단하게 흔히 사용할 만한 방식을 말하자면,
ex) TABLE : A
- A 테이블에 존재하는 데이터를 리스트(SELECT)로 가져온다. 그 이후 stream filter 를 이용하여 해당 데이터가 이미 존재하는 데이터인지 아니면 신규 데이터인지 foreach를 통해 확인하는 방법
- 신규 데이터 리스트에 대한 foreach를 돌리면서 해당 정보에 대한 A 테이블 정보가 있는지 그때 마다 DB에 요청하여 등록 또는 수정여부를 확인하는 방법
1번과 2번 둘 다 가능한 방법이지만 1번은 어느정도 데이터까지는 서버에서 체크를 하기에 이상이 없겠지만 결국 특정 데이터량 위치까지 갔을때는 속도에 문제가 될 이유가 됩니다.(그렇지만 그렇게 데이터가 막 100만개 이상이 아닌경우는 뭐… 낫배드)
2번은 DB 커넥션인 굉장히 많이 발생하게 되는 부분이기에 데이터가 많아지면 많아질수록 과부화가 올 수 있는 방법이다.(이건 정말 암…덩어리)
이보다 더 좋은 방법이 없을까? 곰곰히 생각해보면 이런생각을 하게 된다. 그냥 insert 할때 데이터 있는지 체크해주고 있으면 UPDATE 처리해주는 방법은 없을까?? 너무 좋게도 있다.
ON DUPLICATE KEY UPDATE 를 이용하게 될 경우 생각하고 있는 방식을 그대로 적용할 수 있다.
ex)
facebook에서 나의 게시글을 일괄적으로 들고와 db에 등록하는 방식이라고 생각해보자
데이터는 하루에 20분마다 요청하여 들고오는 방식이다.
그럴 경우 우린 1번과 2번같은 방법을 통해 데이터를 insert할지 아니면 update를 할지 정하게 될 것이다. 하지만 아래에 있는 쿼리를 이용하게 된다면 insert하는 동시에 해당 데이터가 존재하는지 primary key 와 unique key 를 통해 확인하여 insert 대신 update 를 진행하게 된다.
<!-- 같은 pk의 데이터일 경우 업데이트를 진행 -->
INSERT INTO sns_facebook_channel (
fb_post_id
, fb_user_id
, fb_message
, fb_caption
, fb_description
, fb_picture
, fb_source
, fb_link
, fb_created_time
, create_date
, modify_date
) VALUES (
#{postId,jdbcType=VARCHAR}
, #{userId,jdbcType=VARCHAR}
, #{message,jdbcType=VARCHAR}
, #{caption,jdbcType=VARCHAR}
, #{description,jdbcType=VARCHAR}
, #{picture,jdbcType=VARCHAR}
, #{source,jdbcType=VARCHAR}
, #{link,jdbcType=VARCHAR}
, #{createdTime,jdbcType=VARCHAR}
, sysdate()
, sysdate()
) ON DUPLICATE KEY UPDATE
fb_user_id = #{userId,jdbcType=VARCHAR}
, fb_message = #{message,jdbcType=VARCHAR}
, fb_caption = #{caption,jdbcType=VARCHAR}
, fb_description = #{description,jdbcType=VARCHAR}
, fb_picture = #{picture,jdbcType=VARCHAR}
, fb_source = #{source,jdbcType=VARCHAR}
, fb_link = #{link,jdbcType=VARCHAR}
, modify_date = sysdate()
이러한 방식은 대용량 데이터를 일괄적으로 처리해야하는 상황에서 유용하게 사용할 수 있는 방식이다.
'데이터베이스' 카테고리의 다른 글
MYSQL INSERT시 이미 존재할 경우 등록하지 않는 쿼리 (1) | 2023.12.22 |
---|
- Total
- Today
- Yesterday
- 도커
- spring
- centos7
- dockerfile
- dfs
- 리눅스
- 네이버 클라우드
- Linux
- 이미지
- Java
- 격리수준
- insert
- 캘린더
- 스케줄러
- ncp
- leatcode
- Cache
- docker
- mybatis
- 개념 이해하기
- LocalDate
- 컨테이너
- Quartz
- 정의
- hazelcast
- MySQL
- Lock
- 캐시
- 권한
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |