MySQL 9

옵티마이저, 힌트

👣 개요 특정 쿼리를 실행하는 방법은 매우 다양한 방법이 있을 수 있다. 테이블 자체를 풀 스캔 하던지 인덱스를 이용해서 검색하던지 등등의 방법이 많다. 하지만 최적의 방법은 존재하기 때문에 해당 방법을 찾는 장치가 필요하다. 그러한 역할을 옵티마이저가 담당한다. 👣 용어 정리 실행 계획 쿼리를 이용해서 데이터를 어찌 가져올까에 대한 계획. 옵티마이저 실행 계획 중 가장 최적화된 것을 찾는 주체. 👣 쿼리 실행 절차 쿼리가 실행되는 절차는 3 단계로 나뉜다. 1. SQL 문장을 잘게 쪼게서 서버가 이해할 수 있는 수준으로 분리(Parse Tree)한다. 2. Parse Tree를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용할지를 선택한다. 3. 결정된 읽기 순서를 이용해서 스토리지 엔진으로부터 데..

MySQL 2023.09.13

인덱스

👣 랜덤 I/O와 순차 I/O 랜점 I/O라는 것은 물리적으로 인접하지 않은 메모리의 내용을 조회하는 행위를 말하는 것이고 순차 I/O는 물리적으로 인접한 메모리의 내용을 조회하는 행위다. HDD 같은 경우엔, 디스크 헤더를 움직여서 메모리를 조회하기 때문에 두 방식의 차이는 매우 크다. 만약 N개의 랜덤 I/O를 요구한다면 N번의 SystemCall을 해야 하고 순차 I/O의 경우엔 1번의 SystemCall만 요구하기 때문에 N배 더 빠르다고 볼 수 있고 이것은 매우 큰 차이다. SDD도 마찬가지로 두 방식에서 차이가 크기 때문에 SSD 드라이브 사양에도 항상 순차 I/O, 랜덤 I/O의 성능을 명시하도록 되어 있다. 결론적으로 빠른 조회를 위해 순차 I/O를 더 적극적으로 활용해야 한다. 👣 인덱스..

MySQL 2023.08.02

트랜잭션과 잠금

👣 트랜잭션 '쪼갤 수 없는 업무 처리의 단계'로 정의될 수 있다. 트랜잭션은 ACID라고 불리는 4 가지 특성을 가지고 있다. 해당 특성을 요약하면 결국 데이터의 정합성을 보장하는 특성들이라고 볼 수 있다. MySQL의 스토리지 엔진 중 InnoDB는 트랜잭션을 지원하고 MyISAM은 트랜잭션을 지원하지 않는다. 👣 잠금 동시성을 구현하기 위해 트랜잭션들이 무분별하게 특정 데이터를 사용하는 것을 막아야 한다. 이를 위해 잠금이라는 기능을 이용하는데 데이터에 대한 접근을 특정 트랜잭션에게만 허용함으로서 데이터의 정합성을 실현할 수 있다. 👣 MySQL 엔진의 Lock MySQL 엔진은 모든 스토리지 엔진에 영향을 미친다. MySQL 엔진 잠금에는 4가지의 종류가 있다. 1. 글로벌 Lock 2. 테이블 ..

MySQL 2023.08.02

MySQL 로그 파일

👣 개요 MySQL 서버에 문제가 생기면 로그 파일을 이용해서 부하의 원인, 서버 상태를 쉽게 찾아서 진단할 수 있다. 때문에 서버 진단 시, 로그파일을 확인하는 습관을 들여야 한다. 👣 에러 로그 파일 말그대로 에러나 경고 메시지를 출력하는 로그 파일이다. 위치는 설정 파일(my.cnf)에서 log_error라는 파라미터로 정의된 경로에 생성된다. 해당 에러 파일에는 다음과 같은 내용들이 기록된다. 1. MySQL이 시작하는 과정과 관련된 정보성 및 에러 메시지 2. 마지막으로 종료할 때 비정상적으로 종료된 경우 나타나는 InnoDB의 트랜잭션 복구 메시지 3. 쿼리 처리 동중에 발생하는 문제에 대한 에러 메시지 4. 비정상적으로 종료된 커넥션 메시지 5. InnoDB의 모니터링 또는 상태 조회 명령의..

MySQL 2023.08.01

MyISAM 스토리지 엔진

👣 개요 MySQL 8.0 이전 버전에서 시스템 테이블로 사용되던 스토리지 엔진이다. 👣 키 캐시 InnoDB의 Buffer Pool과 비슷한 역할을 수행하는 것. 하지만 인덱스만을 대상으로 작동하고 인덱스의 Disk Write에 대해서만 부분적으로 버퍼링을 수행한다. 👣 OS의 시스템 캐시 및 버퍼 MyISAM에는 Disk I/O를 줄여주는 어떠한 캐시나 버퍼링 기능을 탑재되어 있지 않다. 때문에 Disk I/O를 그대로 수행하기에 속도가 느리다. 하지만 대부분의 OS에는 DISK I/O에 대한 캐시, 버퍼링 메커니즘을 탑재하고 있어서 이렇게 간접적으로 기능들을 이용할 수 있다. 이것 또한 OS를 위한 메모리 공간이 존재해야 가능한 것이기에 MyISAM을 사용하고 싶다면 꼭 OS를 위한 메모리 공간을 ..

MySQL 2023.08.01

InnoDB 스토리지 엔진

👣 아키텍처 InnoDB는 MySQL 스토리지 엔진 가운데 유일하게 레코드 기반 잠금을 제공한다. 때문에 높은 동시성 처리가 가능하고 안정적이고 성능이 좋다. 👣 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 Primary Key를 기준으로 클러스터링 된다. 그리고 모든 세컨더리 인덱스는 레코드 주소값이 아닌 Primary Key값을 주소로 사용한다. 때문에 실행 계획에서 다른 보조 인덱스 값보다 Primary 인덱스 값이 더 높은 점수를 가져간다. 즉, Primary Key가 선택되어 실행될 확률이 높다. 인덱스 👣 개요 인덱스는 보통 B-트리로 구성되어 특정 값에 대한 조회가 O(log n) 복잡도로 수행된다. 만약 인덱스가 존재하지 않는 칼럼을 이용해서 조회를 하면 O(n)..

MySQL 2023.08.01

MySQL 아키텍처

👣 개요 MySQL 내부에서 어떤 방식으로 작동하는지를 알기위해 해당 게시물을 작성함. 👣 MySQL 엔진 아키텍처 MySQL은 다른 DBMS에 비해 아키텍처가 매우 독특하다. 👣 MySQL 엔진 해당 부분은 커넥션 핸들러, SQL 파서, 옵티마이저 등등이 속해 있다. 주로 SQL 문장을 분석 및 최적화 하는 등의 두뇌 역할을 수행. MySQL은 표준 SQL(ANSI SQL) 문법을 지원하기 때문에 타 DBMS와 호환 가능하다. 👣 스토리지 엔진 실제 데이터를 저장하고 DISK에서 조회하는 부분. 👣 핸들러 API MySQL 엔진의 쿼리 실행기에서 스토리지 엔진에게 쓰기 or 읽기 요청을 보내는데 이 때 사용하는 API를 핸들러 API라고 한다. 👣 MySQL 스레딩 구조 MySQL은 프로세스 기반이 아..

MySQL 2023.08.01

사용자 계정

👣 계정 등록 MySQL은 계정을 등록하더라도 사용자가 등록 당시 사용한 IP가 아니라면 접근 거부를 한다. 예를 들어, someaccount라는 계정명으로 localhost IP로 등록을 했다고 가정해보면, CREATE USER 'someaccount'@'localhost' IDENTIFIED BY '비밀번호';​ 해당 계정은 someaccount가 192.72.41.232라는 IP로 접근해도 접근할 수 없다. 다만, '%'를 사용해서 User를 생성하면 모든 IP에서 접근 가능하다. %는 모든 IP를 뜻하기 때문이다. 이 방법은 보안상 위험하기 때문에 자제해야 한다. CREATE USER 'someaccount'@'%' IDENTIFIED BY '비밀번호';​ 👣 계정 조회 MySQL에 등록된 계정을..

MySQL 2023.07.31

왜 MySQL을 사용하는가?

👣 개요 DBMS에는 여러 프로그램이 존재한다. ORACLE, PostgreSQL, MySQL, MS-SQL, ... 그 중 압도적인 점유율의 DBMS는 MySQL이다. 왜 MySQL 다른 DBMS에 비해 인기가 많을까? 👣 MySQL 장점 1. 안정성 다양한 상황에서 안정성과 신뢰성을 입증해왔습니다. 많은 기업이 실무에 MySQL을 적용하며, 이를 통해 높은 신뢰도와 안정성을 확보할 수 있습니다. 2. 성능과 기능 빠른 성능을 제공하는 경량 데이터베이스 시스템으로서, 많은 웹 응용 프로그램 및 서버 측 개발에서 선호되는 이유 중 하나입니다. 간단한 쿼리 작업부터 복잡한 데이터 처리까지 효율적으로 처리할 수 있습니다. 3. 커뮤니티와 생태계 큰 개발자 커뮤니티와 다양한 플러그인, 라이브러리, 도구들과 함..

MySQL 2023.07.31