목록Database (15)
forDevLife
인덱스를 알아보기에 앞서, 랜덤 I/O와 순차 I/O에 대해 살펴보자. 랜덤 I/O 하드 디스크 드라이브의 플래터(원판)를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 수 데이터를 읽는 것을 의미한다. 데이터를 R/W하기 위해 페이지의 수 만큼 시스템 콜을 요청하며, 그 횟수만큼 디스크의 헤더 이동이 발생하게 된다. 인덱스 레인지 스캔에 해당한다. 순차 I/O 한 번의 시스템 콜을 통해 여러 페이지 데이터를 R/W한다. 디스크의 헤더 이동이 줄어들어 랜덤 I/O에 비해 더 빠르다. 일반적으로 쿼리를 튜닝하는 것은 랜덤 I/O 자체를 줄이는 게 목적이며, 이 의미는 쿼리를 처리하는 데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미한다. 풀 테이블 스캔에 해당한다. 1. 인덱스의 ..
1. MySQL에서의 트랜잭션 트랜잭션은 하나의 논리적인 작업 셋 자체가 100% 적용되거나(Commit 실행) 아무것도 적용되지 않아야(Rollback 실행) 함으로 보장해준다. 이러한 트랜잭션 기능은 InnoDB 테이블에서만 제공되는 기능이며, 이를 통해 쿼리 실행 중 일부라도 오류가 발생하면 전체를 원 상태로 만든다는 트랜잭션의 원칙을 따르게 된다. 잠금(Lock)과 트랜잭션 기능을 헷갈릴 수 있지만, 기능의 사용 목적을 간단히 정리하면 다음과 같다. 잠금(Lock) : 동시성 제어하기 위한 기능이다. 여러 커넥션에서 동시에 동일한 자원을 변경할 수 없도록 한다. 트랜잭션 : 데이터의 정합성을 보장하기 위한 기능이다. 2. MySQL 엔진의 잠금 MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레..
다음 내용에 이어서 작성된다. InnoDB 스토리지 엔진 아키텍처 1 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반 잠금을 제공하며, 그로 인해 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 주요 기능들을 알아보자. new-age-jh.tistory.com 5. 언두 로그(Undo Log) InnoDB는 트랜잭션과 격리 수준을 보장하기 위해 DML로 변경되기 이전 버전의 데이터를 별도로 백업한다. 이렇게 백업된 데이터를 언두 로그라고 하며 이를 아래와 같은 방식으로 활용할 수 있다. 트랜잭션 보장 : 롤백 시 언두 로그에 백업된 데이터로 복구한다. 격리 수준 보장 : 트랜잭션 격리 수준에 맞게 언두 로그에 백업한 데이터를 읽어서 반환한다. 기존 버전(..
InnoDB 스토리지 엔진에서 가장 핵심적인 부분이며, 크게 아래의 기능을 하게 된다. 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해둔다. 쓰기 작업을 지연시켜 일괄 처리가 가능하도록 해주는 버퍼 역할도 한다. 버퍼 풀의 구조 InnoDB 스토리지 엔진은 버퍼 풀이라는 거대한 메모리 공간을 페이지 크기의 조각(기본 16KB)으로 쪼개어, 필요할 때 해당 데이터 페이지를 디스크로부터 읽어서 각 조각에 저장한다. 이러한 페이지 조각들을 관리하기 위해 크게 3가지의 자료구조를 사용한다. 프리 리스트 : InnoDB 버퍼 풀에서 실제 사용자 데이터로 채워지지 않은 비어 있는 페이지의 목록이다. LRU 리스트 : 디스크로부터 한 번 읽어온 페이지를 최대한 오랫동안 InnoDB 버퍼 풀의 메모리에 유지하기..
InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반 잠금을 제공하며, 그로 인해 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 주요 기능들을 알아보자. 1. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 즉, 프라이머리 키 값의 순서대로 디스크에 저장된다. 모든 세컨더리 인덱스는 물리적인 레코드의 주소(ROWID) 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 결과적으로 쿼리 실행 계획에서 프라이머리 키는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정된다. 반면 MyISAM 스토리지 엔진에서는 클러스터링 키를 지원하지 않아, 프라이머리 키와 세컨더리 인덱스는 구조적으로..
1. 스레드 캐시(MySQL community Version) MySQL 서버에서는 연결 스레드 할당으로 인한 리소스 낭비 및 성능 저하를 막기 위해 특정 개수의 스레드를 메모리에 캐싱해서 사용한다. 이를 통해 연결로 발생하는 오버헤드를 줄일 수 있으며, 클라이언트 커넥션 요청과 (포그라운드)스레드가 1:1로 매핑된다. 즉, 커넥션을 맺은 스레드가 하나의 커넥션 처리만 담당하는게 핵심이다. 2. Connection Pool The MySQL Connection Pool operates on the client side to ensure that a MySQL client does not constantly connect to and disconnect from the MySQL server. It is ..
MySQL의 전체 구조 MySQL 서버는 크게 MySQL엔진과 스토리지 엔진으로 구분할 수 있다. 쿼리 & 파서 & 옵티마이저 등과 같은 기능을 스토리지 엔진과 구분해서 이해하고자 다음과 같이 구분하였으며, 이 둘을 모두 합쳐서 MySQL(서버)라고 호칭한다. 1. MySQL 엔진 MySQL엔진은 클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와, SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 즉 DBMS의 두뇌에 해당하는 처리를 수행한다. 2. 스토리지 엔진 실제 데이터를 디스크 스토리지에 WRITE & READ하는 과정은 스토리지 엔진에서 전담하게 된다. 스토리지 엔진은 여러 개를 동시에 사용할 수 있으며, 테이블 정의 시 지정해서 사용할 수 있다. ..
일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용하는데, 리눅스를 포함한 유닉스 계열에서는 my.cnf라는 이름을 사용하고, 윈도우 계열에서는 my.ini라는 이름을 사용한다. MySQL 서버가 시작될 때만 이 설정 파일을 참조하는데, 이 경로가 고정되어있는것은 아니고, 지정된 여러 개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 my.cnf 파일을 사용하게 된다. 다음 명령어를 통해 MySQL 서버가 어느 디렉터리에서 my.cnf를 읽는지 알 수 있다. shell > mysqld --verbose --help # 또는 shell > mysql --help 실행 결과 Default options are read from the following files in the given order: /e..
1. 맥에서 redis 설치 -> brew install redis 2. 설치된 경로 2-1. redis 실행파일: /usr/local/bin/redis-server, redis-cli ... 2-2. redis 설정파일: /usr/local/etc/redis.conf 3. redis 서버 실행 -> redis-server 4. redis 실행 / 종료 / 재시작 / 클라이언트로 접속 $ brew services start redis $ brew services stop redis $ brew services restart redis -> redis-cli 5. redis 접속 후 키 입력/삭제 -> set dev4u https://devtu.tistory.com -> get dev4u -> del de..
https://sqlzoo.net/wiki/Music_Tutorial Music Tutorial - SQLZOO The Music database This tutorial introduces the notion of a join. The music has two tables: album and track. album(asin, title, artist, price, release, label, rank) track(album, dsk, posn, song) More details about about the database How to do joins. The ph sqlzoo.net GROUP BY -> COUNT, MIN, MAX등을 쓰려면 필요하며, GROUP BY 단독으로는 쓰일 수 있다. COU..