본문 바로가기

교육 및 책23

데이터 타입 문자열(CHAR와 VARCHAR) 문자열 컬럼을 사용할 는 우선 CHAR와 VARCHAR 타입 중 어떤 타입을 사용할지 결정해야 한다. 우선 저장 공간과 비교 방식의 관점에서 CHAR와 VARCHAR를 비교해보고, MySQL 내부적으로 어떤 차이가 있는지도 한 번 살펴보자. 저장 공간 우선 CHAR와 VARCHAR의 공통점은 문자열을 저장할 수 있는 데이터 타입이라는 점이고, 가장 큰 차이는 고정 길이냐 가변 길이냐이다. CHAR 타입은 이미 저장 공간의 크기가 고정적이다. 실제 저장된 값의 유효 크기가 얼마인지 별도로 저장할 필요가 없으므로 추가로 공간이 필요하지 않다. VARCHAR 타입은 최대로 저장할 수 있는 값의 길이는 제한돼 있지만, 그 이하 크기의 값이 저장되면 그만큼 저장 공간이 줄어든다... 2024. 1. 1.
쿼리 성능과 최적화 (2/2) INSERT 일반적으로 온라인 트랜잭션 서비스(OLTP)에서 INSERT 문장은 대부분 1건 또는 소량의 레코드를 INSERT하는 형태이므로 그다지 성능에 대해서 고려할 부분이 많지 않다. 오히려 많은 INSERT 문장이 동시에 실행되는 경우 INSERT 문장 자체보다는 테이블의 구조가 성능에 더 큰 영향을 미친다. 하지만 동시에 INSERT 성능과 SELECT 성능을 빠르게 만들 수 있는 구조는 없기 때문에 어느 정도 타협하면서 테이블 구조를 설계해야 한다. 고급 옵션 SELECT 문장만큼 다양하지는 않지만 INSERT 문장에도 사용할 수 있는 유용한 기능이 있다. 대표적으로 INSERT INGORE 옵션과 INSERT ... ON DUPLICATE KEY UPDATE 옵션을 살펴보자. 두 옵션 모두 .. 2023. 12. 28.
쿼리 작성과 최적화 (1/2) 쿼리 작성과 최적화 어플리케이션 코드를 튜닝해서 성능을 2배 개선하는 것은 쉽지 않지만 DBMS에서 몇십 배에서 몇백 배의 성능 향상이 이뤄지는 것은 상당히 흔한 일이다. 그만큼 SQL 처리에서 "어떻게(HOW)"를 이해하고, 쿼리를 작성하는 것이 중요하다. 쿼리 작성과 연관된 시스템 변수 대소문자 구분, 문자열 표기 방법 등과 같은 SQL 작성 규칙은 MySQL 서버의 시스템 설정에 따라 달라진다. MySQL 서버의 시스템 설정이 쿼리에 어떤 영향을 주는지 살펴보자. SQL 모드 MySQL 서버의 sql_mode라는 시스템 설정에는 여러 개의 값이 동시에 설정될 수 있다. 그중에서 대표적으로 SQL 작성과 결과에 영향을 미치는 값은 어떤 것들이 있는지 살펴보고, sql_mode를 설정할 때는 구분자(,.. 2023. 12. 13.
실행 계획 실행 계획 옵티마이저가 관리자나 사용자의 개입 없이 항상 좋은 실행 계획을 만들어내는 것은 아니다. 이러한 문제에 대해 MySQL 서버에서 보여주는 실행 게획을 일고 이해하려면 MySQL 서버가 데이터를 처리하는 로직을 이해할 필요가 있다. MySQL 서버의 실행 계획에 가장 큰 영향을 미치는 통계 정보에 대해 간략히 살펴보고, MySQL 서버가 보여주는 실행 계획을 읽는 순서와 실행 계획에 출력되는 키워드, 그리고 알고리즘에 대해 살펴보겠다. 통계 정보 MySQL 8.0 버전부터 인덱스되지 않은 컬럼들에 대해서도 데이터 분포도를 수집해서 저장하는 히스토그램(Histogram) 정보가 도입됐다. 히스토그램이 도입됐다고 해서 기존의 테이블이나 인덱스의 통계 정보가 필요한 것은 아니다. 테이블 및 인덱스에 .. 2023. 11. 30.
옵티마이저와 힌트 (2/2) 쿼리 힌트 MySQL 서버는 우리가 서비스하는 비즈니스를 100% 이해하지 못하기 때문에 서비스 개발자나 DBA보다 MySQL 서버가 부족한 실행 계획을 수립할 때가 있을 수 있다. 이런 경우 옵티마이저에게 쿼리의 실행 계획을 어떻게 수립해야 할지 알려줄 수 있는 방법이 필요하기 때문에 이런 목적으로 옵티마이저 힌트가 제공된다. MySQL 서버에서 사용 가능한 쿼리 힌트는 다음과 같이 2가지로 구분할 수 있다. 인덱스 힌트 "STRAIGHT_JOIN"과 "USE INDEX" 등을 포함한 인덱스 힌트들은 SELECT 명령과 UPDATE 명령에서만 사용할 수 있다. 옵티마이저 힌트 STRAIGHT JOIN STRAIGHT_JOIN은 옵티마이저 힌트인 동시에 조인 키워드이기도 하다. STRAIGHT_JOIN은.. 2023. 11. 13.
옵티마이저와 힌트 (1/2) 옵티마이저와 힌트 어떤 DBMS든지 쿼리의 실행 계획을 수립하는 옵티마이저는 가장 복잡한 부분으로 알려져 있으며, 옵티마이저가 만들어 내는 실행 계획을 이해하는 것 또한 상당히 어려운 부분이다. 하지만 실행 계획을 이해할 수 있어야만 실행 계획의 불합리한 부분을 찾아내고, 더 최적화된 방법으로 실행 계획을 수립하도록 유도할 수 있다. 실행 계획을 살펴보기 전에 먼저 알고 있어야 할 몇 가지 사항을 살펴보자. 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 자게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 .. 2023. 11. 10.
인덱스 인덱스 인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다. MySQL 8.0 버전까지 업그레이드되어 오면서 다른 상용 RDBMS에서 제공하느 많은 기능을 지원하게 됐으며, 기존의 MyISAM 스토리지 엔진에서만 제공하던 전문 검색이나 위치 기반 검색 기능도 모두 InnoDB 스토리지 엔진에서 사용할 수 있게 개선되었다. 아무리 MySQL의 옵티마이저가 발전하고 성능이 개선됐다고 해도 여전히 관리자의 역할은 매우 중요하다. 디스크 읽기 방식 컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다. 여전히 데이터 저장 매체는 컴퓨터에서 가장 느린 부분이기 때문에 데이터베이스나 .. 2023. 11. 6.
InnoDB 스토리지 엔진 아키텍처 InnoDB 스토리지 엔진 아키텍처 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. InnoDB의 간단한 아키텍처는 위 그림과 같다. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 즉, 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키가 클러스터링 인덱스이기 때문에 프라이머리 키를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결과적으로 쿼리의 실행 계획에 프라이머리 키는 기본적으로 다른.. 2023. 11. 2.
MySQL 서버 설정과 사용자 및 권한 MySQL 서버 설정 일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용하는데, 리눅스를 포함한 유닉스 계열에서는 my.cnf라는 이름을 사용하고, 윈도우 계열에서는 my.ini라는 이름을 사용한다. MySQL 8.0 서버의 시스템 변수는 대략 570개 수준이며, 사용하는 플러그인이나 컴포넌트에 따라 시스템 변수의 개수는 더 늘어날 수도 있다. 모든 시스템 변수를 공부해야 하는 것은 아니지만 MySQL 서버를 제대로 사용하려면 시스템 변수에 대한 이해가 상당히 많이 필요하다. 설정 파일 MySQL 서버는 시작될 때만 이 설정 파일을 참조하는데, 이 설정 파일의 경로가 고정되어 있는 것은 아니다. MySQL 서버는 지정된 여러 개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 my.cnf 파일을 사용.. 2023. 10. 21.