[TIL] 230217

✏️ Check Box

📌 정리


2월 프리온보딩 마지막 강의는 MySQL에서 효율성을 개선하기 위한 방법들을 소개하는 강의를 준비해주셨다. 이번 프리온보딩에서 가장 관심을 가지고 기다리던 주제였다.

Index

Index는 읽기 속도를 개선하기 위한 별도의 테이블을 생성하는 것이라고 생각하면 될 것 같다. 그렇다면 어떤 기준에 의해 Index를 설정하면 좋을까에 대해 강의에서 설명해주셨다.

  1. Cardinality
  2. Update Frequency
  3. Size

Cardinality는 사전의미로 집합의 크기를 의미하는데, 쉽게 한 컬럼에서 나타날 수 있는 값 종류(Distinct)의 개수라고 생각하면 된다. 너무 적으면 한 식별자에 대한 크기가 크고, PK처럼 너무 많다면 모두 Read 해야하기에 효율이 떨어진다. 실습에선 날짜에 대한 Index를 만들어 예시를 보여주셨지만 사용하는 앱의 요구사항에 맞게 Index를 생성하면 될 것 같다.

Update Frequency는 말 그대로 튜플의 수정이 빈번한가를 고려해야 한다는 것이다. 튜플이 빈번하게 수정되면 그에 따라 Index 테이블도 수정되어야 하며 이 작업에도 시간이 소요되기 때문에 Index 선정에 고려해주어야 한다.

Index 테이블은 Index key와 Pointer로 구성되어 있는데 만약 한 Index의 Size가 커진다면, 크기가 고정된 한 페이지에 담길 수 있는 값들이 적어지기에 그만큼 여러 페이지를 훑어 높은 성능을 기대할 수 없다.

Normalization 및 Partitioning

중복을 제거하기 위한 작업으로 정규화를 진행하지만, 많은 Join은 성능저하의 원인이 되기 때문에 현업에서는 레이턴시를 계산해서 반정규화하는 경우도 많다고 한다.

Partitioning은 정수값과 같이 범위로 지정하는 Range, 특정 값들을 지정하는 List, 그리고 Hash 방식으로 나뉘어져 있다. 그리고 Sharding은 여러 DB에 분산 저장하는 방식이라면 Partitioning은 한 DB내에서 Partition을 구분해서 저장하는 방식이다.

이로써 4회차의 2월 프리온보딩이 끝났다. 이전 프리온보딩 주제보다는 더 기본적인 설명에 집중되어 있었고, 또한 Q&A가 거의 주를 이루었기에 궁금증이 많은 나같은 취준생들에게는 정말 좋은 강의였다.

한편 3월 프리온보딩 주제가 Layered Architecture 개선으로 아주 흥미로운 주제이기에 다시 TIL 포스팅으로 찾아오려 한다.

Back to [TIL] 230215