데이터베이스 9

Join

👣 개요 하나 이상의 테이블을 특정 기준을 이용해서 합치는 연산이다. 👣 Join 원리 👣 중첩 루프 조인 - Nested Loops Join, O(n^2) 2중 for문 원리로 두 테이블을 합치는 방법. 너무 큰 Cost를 지불해야 하기 때문에 대용량 테이블에서 사용하지 않는다. 👣 정렬 병합 조인 - Sort-Merge Join, O(n log n) 정렬 후, 각 테이블에 포인터를 설정하고 포인터의 칼럼값이 같으면 조인하고 다르면 포인터를 움직이는 방식이다. 정렬 병합 조인은 다음과 같은 절차로 동작한다 두 데이터 집합 정렬 먼저 조인을 수행할 두 개의 데이터 집합을 조인 키를 기준으로 오름차순으로 정렬. 이때, 정렬은 병합 정렬(Merge Sort)을 사용. 정렬된 데이터 병합 정렬된 두 개의 데이..

데이터베이스 2023.07.24

인덱스

👣 개요 인덱스는 보통 B-트리로 구성되어 특정 값에 대한 조회가 O(log n) 복잡도로 수행된다. 만약 인덱스가 존재하지 않는 칼럼을 이용해서 조회를 하면 O(n) 복잡도로 , 즉 선형 탐색으로 검색을 수행할 것이다. 인덱스가 존재한다면 조회 성능은 비약적으로 좋아질 것이다. 하지만, 인덱스를 위한 추가적인 저장 공간을 필요로 할 뿐만 아니라 생성, 수정, 삭제를 위해 인덱스에 추가 연산을 수행해야 한다는 점으로 인해 생성, 수정, 삭제 성능은 악화된다. 👣 인덱스 생성 방법 👣 MySQL 1. 클러스터형 인덱스 클러스터형 인덱스는 인덱스와 실제 데이터 레코드를 동일한 페이지에 저장함. 쉽게 말해서 B+Tree 구조로 클러스터형 인덱스를 구성할 때, 리프 노드에 '레코드의 PK 값'이 아니라 '레코드..

데이터베이스 2023.07.24

데이터베이스 종류

👣 관계형 DB 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 DB. SQL을 사용해서 데이터를 조작함. 👣 MySQL 대부분의 OS와 호환되며 가장 많이 사용하는 DB다. C, C++로 만들어졌으며 MyISAM 인덱스 압축 기술, B-트리 기반의 인덱스, 스레드 기반의 메모리 할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스를 제공. MySQL 스토리지 엔진 아키텍쳐 👣 PostgreSQL 디스크 조각이 차지하는 영역을 회수할 수 있는 장치인 VACUUM이 특징인 DB. SQL 뿐 아니라 JSON을 이용해서 데이터에 접근 가능. 👣 NoSQL DB SQL을 사용하지 않는 DB. 대표적으로 MongoDB와 Redis가 존재. 👣 MongoDB JSON을 통해 데이터에 접근하고 Binary JSO..

데이터베이스 2023.07.24

트랜잭션 격리 수준

👣 개요 ACID 원칙 중 Isolation 원칙을 지키기 위해선 트랜잭션 연산 결과가 다른 트랜잭션에 영향을 끼치지 않아야 한다. 이를 완벽하게 지키기 위해선 모든 트랜잭션 연산을 직렬적으로 수행되면 된다. 하지만 이 경우, 성능이 너무 떨어지기 때문에 어느 정도 타협해 병렬적으로 수행하게 할 수 있다. '트랜잭션 수준'의 정확한 정의는 '특정 트랜잭션이 변경하거나 조회하고 있는 데이터에 대해서 다른 트랜잭션에 대한 조회 허용 수준' 라고 할 수 있다. 👣 Read_Uncommitted 격리 수준 가장 낮은 격리 수준으로 트랜잭션이 커밋되지 않아도 다른 트랜잭션에 노출되는 수준이다. 발생 문제 - Dirty Read, Non-Repeatable Read, Phantom Read 👣 Read_Commit..

데이터베이스 2023.07.24

트랜잭션

👣 정의 DB에서 논리적 기능을 수행하기 위한 작업의 단위 👣 ACID 특징 1. Atomicity - 원자성 트랜잭션은 해당 작업 내의 모든 연산이 전부 적용되거나 전부 적용되지 않거나 둘 중 하나여야 함. 애매하게 작업 중간까지만 적용되는 경우는 없어야 한다. 2. Consistency - 일관성 트랜잭션이 수행이 되어도 되지 않아도 데이터의 제약 조건은 언제나 지켜져야 함. 예를 들어, 회원 테이블의 '나이' 속성의 제약 조건은 '0 이상 100 이하'라는 제약조건이 있을 때, 나이를 수정하는 트랜잭션이 수행되기 전이나 후나 위 제약 조건을 충족해야 한다는 것이다. 3. Isolation - 격리성 트랜잭션이 병렬적으로 수행되어도 커밋 이전의 결과가 서로에게 영향을 주면 안 됨. 물론 무작정 연산 ..

데이터베이스 2023.07.23

정규화 과정

👣 개요 릴레이션 간의 잘못된 종속 관계로 인해 DB 이상 현상이 일어날 때, 이를 해결하는 과정. 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정. 절대로 정규화가 성능 상의 이점을 준다는 것은 아니기 때문에 서비스의 상황에 맞춰서 정규화 결정을 내려야 함. [정규화를 진행함] 데이터 무결성을 지키기 용이해진다. 때문에 삽입, 수정, 삭제 성능이 좋아진다. But, 조회 시 Join 연산이 늘어난다. 때문에 조회 성능이 떨어진다. 👣 갱신 이상 1. 수정 이상 반복된 데이터 중에 일부만 수정하면 데이터 불일치 발생 2. 삽입 이상 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능. 3. 삭제 이상 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것..

데이터베이스 2023.07.23

데이터 베이스 용어 정리

👣 DB 일정한 규칙에 의해 구조화되어 있는 데이터 모음. 👣 DBMS 데이터 베이스를 제어, 관리하는 통합 시스템. MySQL, ORACLE, MSSQL 과 같은 것을 예로 들 수 있다. DBMS마다 정의된 SQL로 삽입, 수정, 삭제, 조회 등을 수행할 수 있습니다. 👣 엔터티 현실 세계에서 개체를 표현하는 데 사용되는 개념적인 모델로서 여러 개의 속성을 가지고 있습니다. 👣 릴레이션 DB에서 정보를 구분하는 기본 단위. 엔터티에 관한 데이터를 릴레이션 하나에 담아서 관리함. 릴레이션이 모여서 데이터베이스가 된다. 관계형 DB에서는 '테이블'이라고 불리우며 NoSQL DB에서는 '컬렉션'이라고 한다. 👣 속성 릴레이션에서 관리하는 구체적이고 고유한 이름을 갖는 정보. 👣 도메인 릴레이션에 포함된 각 ..

데이터베이스 2023.07.23

MySQL 스키마 일괄 생성

주의!! 해당 과정은 특정 버전에서만 작동할 수 있습니다. mysql --version # 출력 결과 # mysql Ver 8.0.33-0ubuntu0.22.04.2 for Linux on x86_64 ((Ubuntu)) 👣 schema.sql 작성 -- AGENT CREATE TABLE IF NOT EXISTS `AGENT` ( `ID` BIGINT PRIMARY KEY, `CREATED_AT` TIMESTAMP, `EMAIL` VARCHAR(255) UNIQUE NOT NULL, `PASSWORD` VARCHAR(255) NOT NULL, `NICKNAME` VARCHAR(255) UNIQUE NOT NULL, `PROFILE_IMAGE` VARCHAR(255), `INTRODUCTION` TEXT ..

데이터베이스 2023.07.13

MySQL 설치 - Ubuntu

👣 설치 유무 확인 mysql -u root -p 위 코드를 이용해서 mysql이 설치되어 있는지 확인하기. 👣 MySQL 설치하기 sudo apt-get update -y 1. 우선 위 방법으로 apt-get을 업데이트. sudo apt-get install mysql-server 2. mysql 프로그램 설치 더보기 나의 경우엔 설치 도중에 오류가 발생했었음. 이런 문제가 발생 시, 컴퓨터를 재부팅하고 다음과 같은 명령어로 해결함. sudo dpkg --configure -a 위 명령어를 입력하면 문제가 해결되고 mysql이 작동함. 👣 Root 계정 비밀 번호 바꾸기 sudo mysql -u root 1. mysql 프로그램에 접속함. 설치 오류로 인해 콘솔에서 초기 비밀번호를 부여받지 못해 sud..

데이터베이스 2023.07.13