본문 바로가기

DB

[DB] 문자열 데이터 타입에 글자(한글) 수 제한하기 create table post( ... title varchar(30) not null ... )ENGINE=InnoDB DEFAULT CHARSET=utf8; DB(MySQL)에 게시글을 저장하는 기능을 구현하면서, post 테이블을 생성하였다. 게시글을 저장할 때의 요구 사항은 제목의 최대 글자는 10자였고, utf-8 버전의 한글은 3byte를 차지하므로 데이터 타입을 varchar(30)으로 정의하였다. 💬 UTF-8 UTF-8은 유니코드 문자를 인코딩하는 가변 길이 문자 인코딩 방식 중 하나로, 8비트 기반의 문자 인코딩 방식이다. ASCII 문자(영어...)는 1byte로 표현하고, 한글과 같은 유니코드 문자는 3바이트로 표현한다. insert into post(title) values('테.. 더보기
[DB] 정규화 정규화 중복을 최소화하게 데이터를 구조화하는 프로세스 중복을 제거, 한 곳에서만 데이터를 관리하게 설계 읽을 때는 항상 원본 데이터를 참조 읽을 때 참조가 발생하기 때문에, 조회의 성능을 포기하고 쓰기의 성능을 올린다. 테이블 설계 관점에서, 조회와 쓰기 사이의 트레이드 오프 비정규화 정규화의 반대 중복을 허용하고 참조 없이 읽기가 가능하다. 쓰기의 성능을 포기하고 읽기의 성능을 올린다. Follow 기능을 구현한다고 가정할 때, Flow Entity를 다음과 같이 만들 수 있다. @Getter public class Follow { final private long id; final private String fromMemberNickname; final private int fromMembeAge; .. 더보기
[DB] MySQL MySQL은 가장 인기가 많은 오픈 소스 관계형 데이터베이스이다. 높은 접근성과 낮은 비용이라는 장점을 가진다. sql 안식 표준을 지키고 있다. MySQL Architecture MySQL Engine 판단과 명령을하는 두뇌 역할 쿼리 파서 -> 전처리기 -> 옵티마이저 -> 쿼리 실행기 등의 구성 요소로 이루어져 있다. 쿼리 파서 SQL을 파싱하여 Syntax Tree를 만든다. 해당 과정에서 문법 오류 검사가 이루어진다. 전처리기 쿼리 파서에서 만든 Tree를 바탕으로 전처리를 시작한다. 테이블이나 컬럼 존재 여부, 점근 권한 등 Semantic 오류를 검사한다. 쿼리 파서, 전처리기는 컴파일 과정과 매우 유사하고 매번 구문 평가를 진행한다. 옵티마이저 쿼리를 처리하기 위한 여러 방법들을 만들고, .. 더보기
[DB] MySQL vs PostgreSQL 요즘 PostgreSQL을 사용한다는 이야기를 많이 들어, 기존에 팀 프로젝트에서 자주 사용하던 MySQL과 어떤 점이 다른지 알아보고 정리하였다. MySQL과 PostgreSQL 차이점 MySQL PostgreSQL DB 특성 RDBMS ORDMBS 방식 멀티 쓰레드 멀티 프로세스 사용 환경 OLTP OLTP, OLAP MVCC 지원 UndoSegemnt 방식 MGA 방식 UPDATE 방식 UPDATE INSERT & DELETE 지원되는 JOIN NL JOIN, HASH JOIN NL JOIN, HASH JOIN, SORT JOIN Parallel Query for Select 지원한다. 지원한다. Default Transaction Isolation REPEATABLE READ READ COMMIT.. 더보기
Hot Key 과도하게 읽기/쓰기 요청이 집둥되게 되는 Key를 의미한다. 해당 Key의 접근으로 인해 Storage(DB, Cache) 성능 저하가 발생하게 된다. 문제 상황 Cache Server의 최대 성능은 100,000 TPS라고 가정한다. API Server로 부터 A Key에 대한 요청이 150,000개가 발생한다면, Cache Server에 해당 Key가 존재하지만 서버 부하가 높아져 응답할 수 없어 Timeout이 발생하고 50,000 개의 요청은 DB Server로 보내지게 된다. Hot Key에 대한 일반적인 해결책 Query Off (Read From Secondry) Read Replica를 여러 개 생성해두고 요청을 나누어 처리한다. Write는 Primary, Read는 Secondary를 .. 더보기