전체 글

단계별로 성장하자!
1. 성능 최적화 계기 현재 프로젝트는 예약과 관련하여 시간을 많이 다루고 있다. 따라서, DATETIME 타입의 컬럼을 범위 비교 또는 동등 비교하여 조회하는 쿼리가 많이 존재하였다. 해당 컬럼에 대해 인덱스를 지정하여 성능 최적화를 할 수 있을것 같아 Real MySQL 8.0의 도움을 받아 시도해보았고 기간별 예약 내역 조회 쿼리에 대해 1374% 향상을 보게 되었다. 2. 문제의 쿼리 문제의 아래 쿼리는 기간별로 예약 내역을 조회하는 쿼리이다. where절에서 DATETIME 타입의 예약 시작날짜시간에 해당하는 start_at 컬럼에 대해 BETWEEN 연산을 진행한다. 나는 start_at 컬럼에 대해 Index를 적용해보고자 했다. select reservatio0_.project_table_..
일반적으로 웹 서비스와 같이 일반적인 온라인 트랜잭션 처리 환경의 DB에서는 INSERT나 UPDATE 작업의 경우 거의 레코드 단위로 발생하므로 성능상 문제가 되는 경우가 거의 없다. 하지만, SELECT의 경우 여러 개의 테이블로부터 데이터를 조합해서 빠르게 가져와야 하기 때문에 주의를 기울여야 한다. 따라서, SELECT 쿼리의 각 부분에 사용될 수 있는 기능을 성능 위주로 살펴보고자 한다. 1. SELECT 절의 처리 순서 아래와 같은 다양한 키워드를 이용한 SELECT 문이 존재한다. 이런 경우 어떠한 절이 먼저 실행되는지 예측해야 최적화를 할 수 있다. SELECT, FROM, WHERE. GROUP BY, HAVING, ORDER BY, LIMIT SELECT s.emp_no, COUNT(D..
애플리케이션에서 데이터를 저장 또는 조회하기 위해 DB와 통신할 때 DB 서버로 전달되는 것은 SQL 뿐이다. SQL은 어떠한(What) 데이터를 요청하기 위한 언어이지, 어떻게(How) 데이터를 읽을지를 표현하는 언어는 아니므로 자바와 같은 언어와 비교했을 때 제한적으로 느껴질 수 있다. 그래서 쿼리가 빠르게 수행되게 하려면 DB 서버에서 쿼리가 어떻게 요청을 처리할지 예측할 수 있어야 한다. 애플리케이션 코드를 튜닝해서 성능을 개선한다는 것은 쉽지 않지만, DBMS에서는 몇십 몇백 배의 성능 튜닝은 흔한 일이다. 따라서 SQL 작성 방법이나 규칙은 물론, 내부적인 처리 방식(옵티마이저)에 대해 공부해야 한다. 1. MySQL 연산자 (1) 날짜 다른 DBMS에서 날짜 타입을 비교하거나 INSERT하려..
1. InnoDB 버퍼 풀 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간이다. 쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼 역할도 같이 한다. 일반적인 애플리케이션에서는 INSERT, UPDATE, DELETE 처럼 데이터를 변경하는 쿼리는 데이터 파일의 이곳저곳에 위치한 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시킨다. 하지만, 버퍼 풀이 이러한 변경된 데이터를 모아서 처리하면 랜덤한 디스크 작업의 횟수를 줄일 수 있다. 버퍼 풀의 크기 설정 운영체제와 각 클라이언트 스레드가 사용할 메모리를 고려하여 설정해야 한다. MySQL 5.7 버전부터는 InnoDB 버퍼 풀의 크기를 동적으로 조절할 수 있게 개선되었다. 따라서 상황을 조금씩 보면서 증가시키는게 최..
MySQL 5.5 버전 이후 부터는 기본 스토리지 엔진이 InnoDB 스토리지 엔진으로 변경되었다. 1. InnoDB 스토리지 엔진 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 1-1. PK에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 PK를 기준으로 순서대로 클러스터링되어 디스크에 저장되며, 모든 세컨더리 인덱스는 레코드의 주소 대신 PK의 값을 논리적인 주소로 사용한다. PK가 클러스터링 인덱스이기 때문에 PK를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결과적으로 쿼리의 실행 계획에서 다른 보조 인덱스보다 PK가 선택될 확률이 높다. MyISAM ..
MySQL 서버는 크게 머리 역할을 하는 MYSQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구성된다. 기본으로 제공되는 스토리지 엔진으로는 InnoDB과 MyISAM 등이 있고, 핸들러 API를 만족하면 누구든지 스토리지 엔진을 추가하여 MYSQL 서버에 추가할 수 있다. 1. MYSQL 전체 구조 MySQL 고유의 C API부터 JDBC나 ODBC, 그리고 .NET의 표준 드라이버를 제공하며, 이러한 드라이버를 이용하여 C/C++, PHP, 자바, 펄, 파이썬, 루비, .NET 등 모든 언어로 MYSQL 서버에서 쿼리를 사용할 수 있게 지원한다. MySQL 엔진 Client로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러 SQL 파서 및 전처리기 쿼리의 최적화된 실행을 위한 옵티마이저 위 구..
DevPoong
Poong