칼럼의 데이터 타입 선정 칼럼의 데이터 타입과 길이를 선정할 때 주의해야 할 점은 다음과 같다. 저장되는 값의 성격에 맞는 최적의 타입을 선정 가변 길이 칼럼은 최적의 길이를 지정 조인 조건으로 사용되는 칼럼은 똑같은 데이터 타입을 선정 너무 긴 길이는 저장 공간의 낭비를 초래하고, 너무 짧은 길이는 추후 스키마 변경 작업 시 많은 부담을 가져오게 되므로 초기 스키마 설정에서 신중하게 조사 후 데이터 타입을 결정해야 한다. 문자열 (CHAR, VARCHAR) CHAR와 VARCHAR의 차이 CHAR와 VARCHAR의 가장 큰 차이점은 고정 길이인지 가변 길이인지의 여부다. 고정 길이 실제 입력되는 칼럼 값의 길이에 따라 사용하는 저장 공간의 크기가 변하지 않는다. 가변 길이 최대로 저장할 수 있는 값의 ..
자바 JDBC와 같은 인터페이스는 애플리케이션과 MySQL DB 중간에 위치하고 있어서 양쪽의 특성을 잘 알지 못하면 최적의 옵션을 선택하기가 쉽지 않다. JDBC 드라이버의 작동 방식을 변경하기 위한 옵션이나 주의할 점을 잘 알고 있어야 상황에 맞게 최적화하여 사용할 수 있다. MySQL Connector/J 자바에서 제공하는 JDBC는 껍데기와 같은 인터페이스이고, 실제 알맹이인 구현체는 각 DBMS 제조사에서 제공하는 JDBC 드라이버이다. Connector/J를 이용해 MySQL 서버에 접속하려면 JDBC URL이라는 개념을 알아야 한다. 여기서의 URL은 일반적인 HTTP, FTP에서 사용하는 URL이 아니라 MySQL 서버의 정보를 표준 포맷으로 조합한 문자열이다. 이를 커넥션 스트링이라고 한..
InnoDB의 기본 잠금 방식 InnoDB에서는 각 쿼리의 패턴별로 사용하는 잠금이 다르다. 먼저 기본적으로 각 쿼리가 어떤 잠금 방식을 사용하는지 알아보자. SELECT REPEATABLE-READ 이하의 트랜잭션 격리 수준에서 InnoDB 테이블에 대한 SELECT 쿼리는 기본적으로 아무런 잠금도 사용하지 않는다. 또한 이미 잠긴 레코드를 읽는 것도 아무런 제약이 없다. SELECT 쿼리로 읽은 레코드를 잠그는 방법은 읽기 모드와 쓰기 모드 잠금으로 두 가지가 있다. SELECT * FROM sample_tbl WHERE col1 = 10001 LOCK IN SHARE MODE; SELECT * FROM sample_tbl WHERE col1 = 10001 FOR UPDATE; LOCK IN SHAR..
사용자 정의 변수 소개 변수의 종류 MySQL의 변수는 누가 생성하는지에 따라 시스템 변수와 사용자 변수로 구분된다. 변수의 적용 범위가 MySQL 전체인지 아니면 커넥션 범위인지에 따라서 글로벌 변수와 세션 변수로 나뉘기도 한다. 또한 동적으로 서버의 중단 없이 변수를 변경할 수 있는지에 따라 동적 변수와 정적 변수로 구분되기도 한다. 사용자 정의 변수는 말그대로 사용자 변수이면서, 해당 커넥션에서만 유효한 세션 변수이고, 언제든지 값을 변경할 수 있기 때문에 동적 변수로 볼 수 있다. 사용자 정의 변수의 사용 하나의 커넥션에서 정의된 사용자 변수는 다른 커넥션과 공유되지 못하고 해당 커넥션에서만 사용할 수 있다. MySQL의 사용자 변수 이름은 @로 시작한다. 사용자 정의 변수에 할당할 수 있는 값의..
MySQL의 파티션 파티션이란 MySQL 서버의 입장에서는 데이터를 별도의 테이블로 분리해서 저장하지만 사용자 입장에서는 논리적인 하나의 테이블로 사용할 수 있게 하는 기능을 의미한다. 파티션을 사용하는 이유 하나의 테이블이 너무 커서 인덱스의 크기가 물리적인 메모리보다 훨씬 큰 경우 단일 INSERT나 SELECT를 빠르게 처리할 수 있다. 파티션을 나누면 인덱스도 각각 생성되기 때문에 작은 인덱스 크기로 인해 메모리에서 빠르게 쿼리 작업을 진행할 수 있다. 데이터 특성 상 주기적인 삭제 작업이 필요한 경우 효율적으로 관리할 수 있다. 로그 데이터가 대표적인 예시다. 파티션의 INSERT, UPDATE INSERT INSERT 되는 칼럼 중 파티션 키인 칼럼을 이용해 파티션 표현식을 평가하고, 해당 파..
트랜잭션 트랜잭션이란, 논리적인 작업 셋(Set)을 완벽하게 처리하거나 반대로 실패할 경우 원 상태로 전부 복구하는 기능이다. 그래서 작업의 일부만 적용되는 Partial Update 가 일어나지 않도록 한다. MySQL 에서의 트랜잭션 스토리지 엔진 중 MyISAM 이나 MEMORY 같은 스토리지 엔진은 트랜잭션을 지원하지 않는다. 트랜잭션이 없어서 사용하기 단순할 것 같지만, 오히려 더 많은 문제를 만들어낸다. 일부 과정이 실패했을 때 생기는 Partial Update 같은 문제는 더 복잡한 후속조치 과정을 양산할 뿐이다. InnoDB 스토리지 엔진은 트랜잭션을 지원하기 때문에 논리적인 작업들의 단위가 전부 반영되거나, 전부 반영되지 않는 것을 보장한다. 트랜잭션 적용 시 주의사항 트랜잭션은 트랜잭션..
MySQL 아키텍처 MySQL의 전체 구조 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분해서 볼 수 있다. MySQL 엔진 : 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러, SQL 파서 및 전처리기, 그리고 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 또한 성능 향상을 위해 캐시나 버퍼 풀과 같은 보조 저장소 기능이 포함돼 있다. 스토리지 엔진 : 위의 MySQL 엔진이 쿼리 분석 및 최적화 등의 두뇌 활동을 담당하고, 실제 데이터를 디스크에 저장하거나 디스크에서 데이터를 읽어오는 부분은 스토리지 엔진이 처리한다. MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다. 'CREATE TABLE test_ta..
서버 설정 my.cnf 설정 파일의 위치 MySQL 서버는 단 하나의 설정 파일만 사용하는데, 유닉스 계열에서는 my.cnf 라는 이름을 사용한다. 서버를 시작할 때만 해당 파일을 참조하는데, 지정된 여러 개의 디렉터리를 순회하면서 처음 발견된 my.cnf 파일을 사용한다. my.cnf 를 찾기 위해 순회하는 디렉터리 경로가 궁금하다면 다음의 명령어들로 확인해볼 수 있다. 단, mysqld 프로그램은 MySQL 서버의 실행 프로그램으로 해당 option 을 빠뜨리면 실제 서버를 기동할 수 있으니 두번째 명령어로 확인해 보는 것이 좋다. shell> mysqld --verbose --help shell> mysql --help 해당 명령어의 결과를 살펴보면 상당히 많은 내용 안에 다음과 같은 내용이 있다...