요르딩딩
[TIP] DBMS Update란 (읽음카운트) 본문
읽음카운트에 대해서 얘기하자.
예를들어서 500명이 있는 단톡방에 대화 400개 이상 안읽었던 사람이 오랜만에 들어간다! 라고 하면
i/o가 기하급수적으로 늘어납니다.
Update문을 실행시킬때, DBMS내에서는 내부적으로 delete 후 insert 하는 방식으로 처리됩니다.
update문 1회실행하는데 I/O는 2회 발생하는거죠.
순차탐색으로 특정일 이전의 데이터들을 전부 업데이트 치면 성능이 급격하게 떨어짐니다.
이는 업무 특성에 맞는 db설계만으로 i/o를 획기적으로 줄일수가 있습니다.
예를들어 설명해볼게요.
홍길동이 t_chat 테이블에 unread_users라는 필드를 두고..
chat 별로 unread_users 필드에 "1001,1002,1003" 으로 저장해두고
유저 1002가 해당 챗을 읽으면, unread_users필드를 "1001,1003"으로 업데이트 치는 방식으로 하는건지 궁금해 했어요.
그렇게 할경우.. 해당 챗 하나에 대해 안읽은사람 카운트를 하려면 쉼표갯수+1을 해야합니다. 스트링 순차탐색이 필요한거죠.
챗 하나뿐이면 상관없는데.... 제가 300개 이상 안읽은 단체톡방에 오랜만에 들어가는 경우에... 300개 chat 레코드에 대해 unread_users필드값에서 일일이 제 id를 빼고 업데이트를 해야하죠.. count를 세려면 별도로 select 해야하고...
채팅이라는 데이터 흐름 자체가 오늘 10시에 누가 입력한 챗을 읽은 사람이라면, 오늘 9시에 다른사람이 입력한 챗도 읽은것으로 간주할수 있죠?
거기에 착안해서.. 사용자별로 최종 읽은 챗의 일련번호만 하나씩 갖고있게 하고, UI 단에서 해당 챗 seq번호와, 사용자별 최종읽음일련번호의 크기를 대조해서.... 카운트를 뽑을 수 있으니
DB의 Disk I/O도 현격하게 줄어들고, 서버의 연산작업도 현격하게 줄어들고.. 사용자 UI단에서만 안읽음카운트를 연산해서 보여주면 되는 구조가이뤄지는거죠!
'[Web] > [DB & Mybatis]' 카테고리의 다른 글
[DB] 인덱스 장점/단점 (0) | 2021.05.21 |
---|---|
[TIP] 쿼리작성 팁 (mybatis) (0) | 2021.03.14 |
[BASE] DataBase 강의2 정리 (0) | 2021.03.07 |
[TIP] DB 포괄열 (0) | 2020.12.23 |
[TIP] DB 인덱스 (0) | 2020.12.23 |