topic_title
에 연결된 tag.name
들을 조회하려면, JOIN을 통해 해야 한다. 그런데 만약 JOIN이 빈번하게 발생하여 과부하가 걸려 역정규화를 통해 해소하고자 한다면 어떻게 해야 할까?topic_tag_relation
테이블에 tag_id에 해당하는 tag.name
을 함께 저장한다.테이블에 파생 컬럼을 만들어 group by, count 계산 작업을 줄인다.
GROUP BY
, COUNT
연산을 하는 쿼리를 작성해야 한다.author
테이블에 topic_count
컬럼을 추가한다. topic
테이블에 데이터가 하나씩 쌓일 때마다 author.topic_count
의 값을 수정해서 각 저자가 몇 개의 글을 갖고 있는지 기록한다.topic
에 데이터가 추가, 삭제될 때마다 author.topic_count
컬럼의 값을 항상 관리해줘야 하는 복잡함이 생겼지만, 무겁고 복잡한 연산을 줄임으로써 훨씬 빠르게 데이터를 가져올 수 있게 되었다.컬럼 또는 행을 기준으로 테이블을 분리한다.
topic.description
컬럼을 조회하는 쿼리이고, 다른 하나는 이를 제외한 나머지 컬럼들을 조회하는 쿼리다. topic.description
은 그 자체로 크기가 아주 크고, 후자의 쿼리는 연산이 매우 복잡하다. 이 상황에서 성능을 높이기 위해 역정규화를 한다면 어떻게 할 수 있을까?topic
테이블에서 description
을 떼어내 topic_description
테이블로 저장한다.topic
테이블에 데이터가 수억건 씩 쌓이고, 조회 역시 아주 빈번하게 일어난다고 생각해 보자.1 <= author_id <= 1000
이라면 topic_1000
테이블에, 1001 <= author_id <= 2000
이면 topic_2000
테이블에 저장하는 식이다. FK를 추가하여 JOIN을 줄인다.
author_id = 1
를 넣기 위해, 2회의 JOIN이 필요하다SELECT
tag.id, tag.name
FROM
topic_tag_relation AS TTR
LEFT JOIN tag ON TTR.tag_id = tag.id
LEFT JOIN topic ON TTR.topic_title = topic.title
WHERE author_id = 1;
topic.author_id
를 topic_tag_relation.author_id
로 옮긴다면, 조인을 1회로 줄일 수 있다.SELECT
tag.id, tag.name
FROM
topic_tag_relation AS TTR
LEFT JOIN tag ON TTR.tag_id = tag.id
WHERE author_id = 1;
* 이 내용은 생활코딩의 "관계형 데이터 모델링" 수업을 듣고 개인적인 공부를 위해 정리한 것입니다. 문제가 있다면, 지적해 주시면 감사하겠습니다!
출처: