본문 바로가기

Database

(18)
커넥션 풀과 DB에서 병목이 발생하는 이유 스프링 부트 환경에서 개발을 하게 되면 HikariCP 커넥션 풀 라이브러리가 디폴트로 박혀있다. 커넥션 풀이란 커넥션 객체를 담은 자료구조를 의미한다. 커넥션을 얻기 위해서는 TCP 통신 및 DB 내부 검증(인증, 사용자의 접근 권한) 등을 거쳐야 하는데 이러한 과정을 미리 처리해둘 수 있기 때문에 시간적인 측면에서 효율적이다. 커넥션 풀에는 DB와 통신하기 위한 객체가 존재한다고 보면 된다. HikariDataSource dataSource = new HikariDataSource(); dataSource.setMaximumPoolSize(150); DB를 통해서 최대 커넥션 수를 확인할 수 있다. 그래서 애플리케이션 레벨에서 PoolSize를 무한정 늘리더라도 커넥션을 맺지 못한다. 다음은 현재 사..
Real MySQL 8.0 데이터 타입 (1) 문자열과 숫자 포스팅은 Real MySQL 8.0 (2권) 책을 기반으로 작성되었습니다. 각 타입마다 다양한 주제를 다루지만 가장 기초가 되는 부분 위주로 정리하였습니다. 목차 1. 문자열(CHAR, VARCHAR) 2. 숫자 문자열(CHAR, VARCHAR) 저장 공간 CHAR, VARCHAR의 가장 큰 차이는 길이가 고정인지 가변인지이다. CHAR 타입은 고정 길이이다. 고정 길이란 실제 입력되는 컬럼값의 길이에 따라 사용하는 저장 공간의 크기가 변하지 않는다. 그래서 실제 저장된 값의 유효 크기가 얼마인지 별도로 저장할 필요가 없다. VARCHAR 타입은 가변 길이이다. 가변 길이는 최대로 저장할 수 있는 값의 길이는 제한되어 있지만 그 이하 크기의 값이 저장되면 그만큼 저장 공간이 줄어든다. 하지만 가변 길이는..
Redis - 컬렉션 (1) set, hash, sorted set Redis 공식 문서 를 참고하여 작성하였습니다. 지난 달에 스프링 환경에서 Redis를 사용하는 글(Spring Data Redis (1) 캐시와 Redis)을 가볍게 3편 정도 작성했는데요. 그동안 관계형 데이터베이스만 다루다 NoSQL을 다루니 색다르고 재밋더라구요. 그래서 Redis 관련 책도 사서 목차를 보는데 정말 배워야할 내용들이 많더라구요. 그중에서 컬렉션에 대해 정리하려고 합니다. SpringBoot/Docker 환경에서 실습을 진행합니다. 목차 1. set & hash 2. sorted set hash & set hash 스프링 환경에서 Redis에 가장 쉽게 접근하는 방법은 @RedisHash라는 애노테이션을 이용하는 것인데요. @RedisHash(value = "refreshToke..
Real MySQL 8.0 - 실행 계획 type 속성 포스팅은 Real MySQL 8.0 책을 기반으로 작성되었습니다. 이 포스팅은 지속적으로 업데이트될 예정입니다. 실행 계획 type 중 자주 마주하는 것 위주로 작성하겠습니다. 목차 1. INDEX 2. ALL 3. REF 4. CONST INDEX 실행 계획의 type 이 index임은 인덱스 풀 스캔을 의미한다. 즉 인덱스의 필요한 부분만 읽는 것이 아닙니다. 그렇기 때문에 생각보다 효율적이지 않을 수 있습니다. 다만 인덱스는 일반적으로 데이퍼 파일 전체보다 크기가 작으므로 인덱스 풀 스캔은 풀 테이블 스캔보다 빠르게 처리됩니다. 그래도 일반적으로 index를 만드는 이유는 인덱스 풀 스캔을 사용하기 위함은 아니기 때문에 쿼리를 살펴보아야 합니다. ALL 풀 테이블 스캔을 의미한다. 체크 조건이 존재..
Real MySQL 8.0 - SELECT (3) LIMIT n ` 포스팅은 Real MySQL 8.0 (2권) 책을 기반으로 작성되었습니다. 오늘 정리할 내용은 LIMIT입니다. LIMIT은 애플리케이션 레벨에서 개발을 하는 저에게도 친숙한 문법입니다. 주로 페이징 쿼리를 이용할 때 LIMIT을 확인할 수 있는데요. 많은 분들께서 이미 LIMIT의 역할을 알고 계실거라고 생각합니다. 목차 1. LIMIT의 특징과 성능 개선 2. LIMIT이 성능을 개선하지 못하는 경우 3. LIMIT 주의 사항 LIMIT의 특징과 성능 개선 LIMIT의 중요한 특성은 LIMIT에서 필요한 레코드 건수만 준비되면 즉시 쿼리를 종료한다는 것입니다. 이로 인해 보통은 성능 향상을 기대할 수 있습니다. select * from study_group limit 0, 10; limit 절 조..
Real MySQL 8.0 - SELECT (2) WHERE 절의 비교 조건 사용 시 주의사항 포스팅은 Real MySQL 8.0 (2권) 책을 기반으로 작성되었습니다. 목차 1. NULL 비교 2. 문자열이나 숫자 비교 3. 날짜 비교 NULL 비교 SQL 표준에서는 NULL을 비교할 수 없는 값으로 정의하고 있습니다. MySQL에서는 NULL 값이 포함된 레코드도 인덱스로 관리한다. 그렇기 때문에 다른 DBMS와는 조금 다른 차이가 있을수도 있다고 합니다. WHERE 절에서 NULL 값인지 알 수 있는 방법 연산자를 사용하거나 아래 명령어 혹은 함수를 사용하는 것입니다. SELECT * FROM titles WHERE to_date IS NULL; SELECT * FROM titles WHERE ISNULL(to_date); 중요한 점은 이런식으로 사용해야 인덱스를 적절하게 활용할 수 있습니다..
Real MySQL 8.0 - SELECT (1) SELECT 처리 순서 및 WHERE, ORDER BY, GROUP BY 인덱스 사용 조건 포스팅은 Real MySQL 8.0 (2권) 책을 기반으로 작성되었습니다. SELECT는 여러 개의 테이블로부터 데이터를 조합해서 빠르게 가져와야 하기 때문에 여러 개의 테이블을 어떻게 읽을 것인가에 많은 주의를 기울여야 한다. 이번 포스팅에서는 SELECT 쿼리의 각 부분에 사용될 수 있는 기능을 성능 위주로 정리하겠습니다. 목차 1. SELECT 절의 처리 순서 2. 인덱스를 사용할 수 있는 조건 3. WHERE 절 인덱스 사용 4. GROUP BY 인덱스 사용 5. ORDER BY 인덱스 사용 SELECT 절의 처리 순서 대부분의 SELECT 절은 아래와 같은 순서(W&J,G.D.H.O.L)로 실행된다. 한 가지 염두해야할 부분은 ORDER BY,GRUOP BY 절의 경우 인덱스를 이용해 처리할 때..
Real MySQL 8.0 - MySQL의 격리 수준 포스팅은 Real MySQL 8.0 책을 기반으로 작성되었습니다. JPA와 같은 데이터 접근 기술을 사용하거나 데이터베이스를 공부해본 사람이라면 트랜잭션 ACID에 대해 한 번 쯤은 들어봤을 것 같다. 사실 내가 지금까지 읽은 책이나 들었던 강의는 애플리케이션 레벨에서 데이터베이스를 접근하는 것에 대해 배운 것이라 트랜잭션에 대해 엄청난 깊이를 기대하기에 무리였던 것 같다. 특히 고립성(Isolation), 지속성(Durability) 부분은 음.. 그렇구나! 라고 이해한 부분이 생각보다 많았다. 특히나 지속성은 그렇다. 오늘은 트랜잭션의 고립성과 관련된 격리 수준을 정리해보려고 합니다. 참고로 MySQL이 지속성을 어떻게 보장하는지 궁금한 사람이라면 InnoDB 스토리지 엔진의 언두 로그에 대해 검색해..