본문 바로가기

DB

(16)
Real MySQL 10장 실행계획 옵티마이저가 항상 좋은 실행 계획을 만들어낼 수 있는 것은 아니다. 그렇기 때문에 DBMS 서버에서는 이를 보완할 수 있도록 EXPLAIN 명령으로 옵티마이저가 수립한 실행 계획을 확인할 수 있다. MySQL 서버의 실행 계획에 가장 영향을 미치는 통계 정보를 살펴보고, 실행 계획을 읽는 순서와 키워드들을 살펴보자 10.1 통계 정보 MySQL 5.7 까지는 테이블과 인덱스에 대한 정보를 가지고 실행 계획을 수립했다. MySQL 8.0 부터는 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수집해서 저장하는 히스토그램 정보가 도입됐다. 10.1.1 테이블 및 인덱스 통계 정보 비용 기반 최적화에서 가장 중요한 지표는 통계 정보다. MySQL 서버에서는 실제 테이블 데이터의 일부를 분석해서 통계 정보를 .. 더보기
Real MySQL 9장 옵티마이저와 힌트 #2 (9.3~) 9.3 고급 최적화 MySQL 옵티마이저는 실행 계획을 수립할 때 통계 정보와 옵티마이저 옵션을 결합해서 최적의 실행 계획을 수립한다. 여기서 옵티마이저 옵션은 크게 조인과 관련된 옵티마이저 옵션과 옵티마이저 스위치로 구분할 수 있다. 9.3.1 옵티마이저 스위치 옵션 옵티마이저 스위치 옵션은 optimizer_switch 시스템 변수를 이용해서 제어한다. 9.3.1절 하위의 옵션들을 on, off, default로 설정하여 사용할 수 있다. 9.3.1.1을 제외한 모든 설정 옵션은 기본값이 on이다. 9.3.1.1 MRR과 배치 키 액세스(mrr & batched_key_access) MRR은 Multi Range Read를 줄여서 부르는 말이다. MySQL 서버는 조인 대상 테이블 중 하나로부터 레코.. 더보기
Real MySQL 9장 옵티마이저와 힌트 #1 (~9.2) MySQL 서버에서 옵티마이저는 각 테이블에 있는 데이터가 어떻게 분포되어있는지 등의 통계정보를 가지고 최적의 실행계획을 수립한다. 9.1 개요 9.1.1 쿼리 실행 절차 쿼리 실행 절차는 크게 세 단계로 나눌 수 있다. SQL 문장을 분석하고 파스 트리를 만든다. SQL 문장의 문법적인 오류를 발견한다. 만들어진 파스트리를 확인해서 테이블과 인덱스를 어떤 식으로 읽을지를 선택한다. (최적화 및 실행 계획 수립) 복잡한 연산을 단순화한다. 조인이 있을 경우 읽는 순서를 정한다. 인덱스 통계정보를 이용해 사용할 인덱스를 결정한다. 가져온 레코드를 임시테이블에 넣고 다시 가공할지를 결정한다. 수립된 실행계획에 따라 스토리지 엔진에서 읽어오도록 요청한다. MySQL 엔진에서 스토리지 엔진으로부터 받은 레코드를.. 더보기
Real MySQL 8장 인덱스 #2 (8.6~) 8.6 함수 기반 인덱스 일반적으로 인덱스는 칼럼의 값 일부 또는 전체에 대해서만 인덱스 생성이 허용된다. 하지만 때로는 칼럼의 값을 변형해서 만들어진 값에 대해 인덱스를 구축하는 것도 필요하다. 함수 기반 인덱스를 구현하는 방법은 다음 두 가지로 구분할 수 있다. 가상 칼럼을 이용한 인덱스 함수를 이용한 인덱스 함수 기반 인덱스는 인덱싱할 값을 계산하는 과정의 차이만 있을 뿐, 실제 인덱스의 내부적인 구조 및 유지관리 방법은 B-Tree 인덱스와 동일하다. 8.6.1 가상 칼럼을 이용한 인덱스 MySQL 8.0 버전 부터는 가상 칼럼을 추가하고 그 가상 칼럼에 인덱스를 생성할 수 있게 됐다. ALTER TABLE user ADD full_name VARCHAR(30) AS (CONCAT(first_na.. 더보기
커넥션풀과 데이터소스 이해 커넥션풀과 데이터소스 이해 커넥션풀이 왜 필요할까? 아래의 코드와 같이 데이터베이스에 접근하는 커넥션을 생성하여 가져올 때 DriverManager.getConnection()을 호출하면 된다. public static Connection getConnection(){ try { Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); log.info("get connection = {}, class = {}", connection, connection.getClass()); return connection; } catch (SQLException e) { throw new IllegalStateException(); } .. 더보기
JDBC란? (SQL Mapper, ORM) JDBC 란 Spring 환경에서 개발을 하면서 JDBC라는 단어는 많이 들어봤지만 굳이 JDBC에 대해 알려고 하지 않았다. 그래서 지금까지 묻어두었던 JDBC를 한번 알아보려 한다. 우리는 알게 모르게 JDBC를 많이 사용하고 있다. 그치만 JDBC를 직접 사용하는 경우는 드물 것이다. 아마도 JPA나 MyBatis와 같은 ORM, Sql Mapper와 같은 기술들을 사용하면서 이 기술들에서 JDBC 인터페이스를 호출하는 경우가 많을 것이다. JDBC란 무엇이고 왜 필요한 것일까? 이전에는 서버와 데이터베이스 간의 통신, 쿼리 요청, 결과 응답을 수행하는 과정에 대해서 표준화된 인터페이스가 존재하지 않았다. 따라서 애플리케이션 개발자가 데이터베이스에 접속(TCP/IP)하는 코드, 쿼리를 요청하는 코드.. 더보기
Real MySQL 8장 인덱스 #1 (~8.5) 8장 인덱스 인덱스에 대한 기본 지식은 쿼리 튜닝의 기본이 되므로 매우 중요하다. 8.1 디스크 읽기 방식 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능은 짧은 시간동안 매우 빠른 속도로 발전했다. 하지만 디스크 같은 기계식 장치의 성능은 제한적으로 발전했다. 비록 최근에 자기 디스크 원판을 사용하는 하드디스크보다 SSD 드라이브가 많이 활용되고 있지만 그래도 여전히 데이터 저장 매체가 컴퓨터에서 가장 느린 부분이라는 사실은 변함이 없다. 이러한 이유에서 데이터베이스 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건일 떄가 상당히 많다. 8.1.1 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) CPU나 메모리 장치는 대부분 전자식 장치인데 하드 디스크 드라이브는 기계식 장치이다... 더보기
Real MySQL 6장 데이터압축, 7장 데이터 암호화 6장 데이터 압축 디스크의 데이터 크기 크면 클수록! 버퍼 풀로 더 많은 데이터를 읽어야 한다. 더티 페이지가 더 자주 디스크로 기록되어야 한다. 백업 및 복구하는데 시간이 더 소요된다. 비용문제가 발생한다. 그래서 DBMS에서는 데이터 압축 기능을 제공한다. 기본적으로 압축이 이루어지면 성능은 저하된다. (압축과 해제에 대한 비용발생) 데이터 압축은 크게 테이블 압축과 페이지 압축으로 나뉘어진다. 6.1 페이지압축 MySQL 서버가 디스크에 저장하는 시점에 데이터 페이지가 압축되어 저장되고, 읽어들이는 시점에 데이터 페이지가 압축 해제되어 읽는다. 즉, InnoDB 스토리지 엔진은 압축해제 상태에서 데이터 페이지를 관리한다. 펀치홀 데이터 페이지를 압축하고나서 남는 공간을 의미한다. 예를들어 16KB .. 더보기