DB의 성능을 높이기 위한 핵심 메모리가 디스크보다 빠르기 때문에 데이터베이스에서는 디스크 접근 횟수를 최대한 줄이고 최대한 메모리에 있는 데이터로 요청을 처리하는 것이 좋다. 즉, 메모리 캐시 히트율을 높이는 것이다. 데이터베이스에서는 쓰기 작업 시에도 디스크에 바로 쓰는 것이 아닌 메모리에 써둔 후 일괄적으로 디스크에 저장한다. 이때 메모리에 데이터를 써둔 상태에서 서버가 다운되면 해당 데이터가 유실되는 것이 아닌가 걱정할 수 있다. 하지만 WAL(Write Ahead Log) 방식을 사용해서 디스크에 데이터를 쓰는 것이 아닌 쿼리 로그를 미리 저장해두고 데이터가 유실되면 해당 로그를 통해 쿼리를 실행시켜 데이터의 저장을 보장할 수 있다. 인덱스 인덱스는 정렬된 자료구조를 가지고 빠르게 탐색 범위를 ..
정규화란? 간단하게 표현하자면, 중복의 최소화를 통해 데이터의 일관성과 변경의 효율성을 높이는 것이다. 하나의 테이블에서 중복으로 존재하는 데이터를 별도의 테이블로 분리해서 한 곳에서 데이터를 관리하여 데이터의 변경이 일어났을 때 하나의 원본 데이터만 수정하면 되기 때문에 효율적이다. 반정규화 반정규화는 정규화와 반대로 중복을 허용하고 데이터의 정합성을 유지하기가 힘들지만 데이터를 참조 없이 읽을 수 있다. 즉, 데이터가 자주 변경된다면 정규화를 하는 것이 좋고, 변경할 일이 없는 데이터의 경우 반정규화가 더 좋을 수 있다. ** 예를 들어 히스토리성 데이터는 주로 읽기 작업을 많이 하고, 변경을 하지 않기 때문에 반정규화가 더 유리하다. 정규화 시 고려사항 조회 빈도와 데이터의 변경 빈도를 고려해보아야..
MySQL 서버 구조 MySQL 서버는 서버로부터 SQL 요청을 받고 해당 SQL을 처리하는 프로세스를 처리하기 위해 아래와 같은 순서로 디스크에 접근해서 요청을 처리한다. MySQL엔진에서 쿼리를 처리하고, 스토리지 엔진을 통해 데이터를 쓰거나 읽을 수 있다. MySQL 엔진 MySQL 엔진은 내부적으로 쿼리 파서, 전처리기, 옵티마이저, 쿼리 실행기를 가지고 있다. 쿼리 파서 SQL을 파싱하여 Syntax Tree를 만들고, 이 과정에서 문법 오류 검사를 수행한다. 전처리기 쿼리파서에서 만든 Tree를 바탕으로 전처리(preprocessing)를 수행한다. ex) 테이블이나 컬럼 존재 여부, 접근 권한 등의 오류 검사 쿼리파서와 전처리기는 컴파일 과정과 매우 유사하지만, SQL은 프로그래밍 언어처럼 ..
고민 게시글에 해시 태그 기능을 넣을 때 DB 스키마를 어떻게 설계할 지 고민해보았다. 게시글 테이블에 해시 태그 컬럼을 추가해서 해시 태그를 저장하는 방법과 해시 태그 테이블을 분리하여 게시글 아이디를 외래키로 사용하는 방법 2가지에 대해 고민해보았다. 해시 태그 방식 해시 태그 테이블을 사용했을 때는 매번 조인을 해야하고, 그에 따라 쿼리가 좀 더 복잡해지며, 데이터가 많아지면 조인으로 인한 성능 저하가 발생할 수 있다는 단점과 정규화를 통해 중복을 최소화하고, 태그에 대한 검색에서는 성능이 잘 나올 수 있다는 장점이 있다. 컬럼 방식 컬럼 방식으로 저장 시 검색에서 parsing 또는 like 연산에 의한 성능 저하가 발생하고, 정규화가 힘들다는 단점이 있지만, 테이블 구조가 심플하고, 조인이 없어..
https://blog.naver.com/PostView.naver?blogId=ajdkfl6445&logNo=221540488900 [MySQL-Workbench] 워크벤치에서 ERD 자동생성 안녕하세요 개발자 마스터정(Master Jung)입니다. 오늘은 워크벤치를 이용하여 자동으로 ERD를 추출하... blog.naver.com