전체 글

Database

[MySQL] B-Tree 인덱스 - 2

이전 글에 이어서 B-Tree 인덱스를 MySQL 관점에서 살펴보겠습니다. [MySQL] B-Tree 인덱스 - 1 대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이에 브랜치 노드로 이루어져 있습니다. 그중 리프 노드에 데이터 레코드의 주솟값을 저 acisliver.tistory.com B-Tree 인덱스를 통한 데이터 읽기 인덱스를 잘 사용하기 위해서는 MySQL이 인덱스를 통해 어떻게 실제 레코드를 읽는지 알아야 합니다. 여기서는 MySQL이 인덱스를 이용하는 대표적인 방법을 살펴보겠습니다. 인덱스 레인지 스캔 인덱스를 사용하는 가장 대표적이고 가장 빠른 방법입니다. 인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정되었을 때..

Database

[MySQL] B-Tree 인덱스 - 1

대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이에 브랜치 노드로 이루어져 있습니다. 그중 리프 노드에 데이터 레코드의 주솟값을 저장하는 것이 Tree 자료 구조를 사용한 인덱스입니다. B-Tree의 B는 Balanced의 약자입니다. 여기서 Balance(균형)은 트리의 높이가 균형을 이룬다는 뜻입니다. 균형을 이룬다는 뜻은 루트 노드에서 리프 노드까지의 거리를 일정하게 유지하는 것을 의미합니다. 리프 노드까지의 거리를 균일하게 유지하는 이유는 루트 노드에서 리프 노드까지의 탐색 시간을 줄이기 위해서입니다. 트리가 한쪽으로 편향되어 있다면 브랜치 노드가 많아져 리프노드까지의 탐색 시간이 증가합니다. 이러한 균형 잡힌 트리를 유지하기..

Database

[MySQL] 인덱스 - 개요

인덱스를 설명하기 전에 디스크 읽기 방식을 설명하고 디스크 읽기 방식이 어떻게 인덱스가 어떻게 쿼리에 영향을 미치는지 살펴봅니다. 디스크 읽기 방식 컴퓨터는 전기적 장치와 기계적 장치로 구성됩니다. CPU나 메모리같은 전기적 장치의 성능은 빠르게 발전해왔지만 HDD 같은 기계적 장치의 성능은 상당히 제한적으로 발전했습니다. 최근 SSD같은 전기적 장치를 사용하지만 아직 데이터 저장 매체는 컴퓨터에서 가장 느린 부분입니다. 데이터베이스 서버 입장에서 디스크 I/O가 가장 큰 병목을 가져오고 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건입니다. 랜덤 I/O와 순차 I/O 랜덤 I/O는 하드 디스크 드라이브의 플래터(원판)을 돌려서 읽어야할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다..

알고리즘

[프로그래머스] 요격 시스템

🎨 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📘 풀이 이 문제는 정렬과 그리디로 풀 수 있습니다. 폭격 미사일을 s에 대해 오름차순, e에 대해 내림차순으로 정렬합니다. // int[][] targets = [[s, e]] Arrays.sort(targets, (int[] a, int[] b) -> { if (a[0] - b[0] == 0) return b[1] - a[1]; return a[0] - b[0]; }); 요격 미사일을 최소한으로 사용해야 하기 때문에 최대한 많은 폭격 미사일이 겹치는 지점을 찾아야 합니다. 폭격 미사일은 (s, e..

Database

[MySQL] 데이터 암호화

MySQL 5.6 버전부터 데이터 암호화를 지원했다. 처음에는 데이터 파일(테이블 스페이스)에 대한 암호화만 제공했다. MySQL 8.0 버전부터 리두 로그, 언두 로그, 바이너리 로그 등도 암호화 기능을 제공하기 시작했다. MySQL 서버의 데이터 암호화 Transparent Data Encryption MySQL 서버는 디스크 저장(at rest) 단계에서 데이터 암호화를 제공한다. 즉, 스토리지 엔진의 I/O 레이어에서 데이터 암호화 및 복호화를 한다. 결국 InnoDB 버퍼 풀에는 평문 데이터 페이지만 존재하기 때문에 MySQL 서버 및 사용자가 테이블의 암호화 유무를 구별할 필요가 없다. 2 단계 키 관리 MySQL 서버는 데이터 파일 암호화에 마스터 키와 테이블스페이스 키를 사용한다. 테이블스..

Database

[MySQL] 데이터 압축

데이터가 압축되면 InnoDB 버퍼풀로 읽어야 할 데이터 페이지가 줄어들고 백업 및 복구 시간도 단축된다. 페이지 압축 file-per-table 테이블 스페이스에 저장된 테이블에 제공하는 데이터 페이지 단위 압축이다. MySQL 서버가 디스크에 저장하는 시점에 데이터 페이지를 압축한다. 반대로 디스크에서 데이터 페이지를 읽는 시점에 데이터 페이지를 압축 해제한다. InnoDB와 Disk 간 I/O 시점에 데이터 페이지를 압축, 압축 해제를 한다. 즉, 버퍼 풀의 데이터 페이지는 압축 해제된 상태이다. 그래서 MySQL 서버의 내부 코드는 압축 여부와 관계없이 투명(Transparent)하게 동작한다. 그래서 페이지 압축은 Transparent Page Compression이라고도 불린다. 한 테이블은 ..

Database

[MySQL] 잠금

잠금 잠금은 동시성을 제어하기 위한 기능이다. 여러 커넥션에서 동시에 동일한 자원(레코드나 테이블)을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경 가능하다. MySQL에서 사용되는 잠금은 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나뉜다. MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 주지만, 스토리지 엔진 레벨의 잠금은 스토리지 엔진간 상호 영향을 주지 않는다. MySQL 서버 글로벌 락 글로벌 락은 MySQL에서 제공하는 잠금 중 가장 범위가 큰 잠금이다. 일단 한 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 대부분의 DDL, DML 실행은 대기 상태가 된다. 아래 명령어를 사용하면 글로벌 락을 획득할 수 있다. mysql> FLUSH TABLES WIT..

알고리즘

[프로그래머스] 표현 가능한 이진트리 - JAVA

🎨 문제 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr📘 풀이이 문제는 분할 정복으로 풀 수 있습니다. 루트 노드를 기준으로 왼쪽 서브 트리와 오른쪽 서브 트리가 포화 이진 트리인지 확인하면 됩니다. 우선 포화 이진 트리에 대해 간단히 알아보겠습니다.포화 이진 트리포화 이진 트리는 모든 내부 노드가 두 개의 자식 노드를 가지며 모든 리프 노드가 동일한 깊이 또는 레벨을 갖습니다.포화 이진트리는 레벨에 따라 노드의 개수가 정해져 있습니다. 루트 노드의 레벨을 0 레벨이라 했을 때 n 레벨의 노드의 개수는 2의 n승이 됩니다. 따라서 n레벨의 포화 이진 트리..

알고리즘

[프로그래머스] 이모티콘 할인 행사 - JAVA

🎨 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📘 풀이 이 문제는 완전 탐색으로 해결할 수 있습니다. 할인율은 10%, 20%, 30%, 40% 중 하나로 설정됩니다. 각 이모티콘의 할인율을 정하고 이에 따라 이모티콘 플러스 가입자 수와 총판매액을 구할 수 있습니다. 따라서 가능한 할인율을 모두 구하고 이 둘이 최대인 값을 구하면 됩니다. DFS, 백트래킹으로 가능한 할인율 순열을 구합니다. private static final int[] RATE = {90, 80, 70, 60}; private void dfs(int[] emoticons, i..

acisliver
와당탕탕 개발놀이터