옵티마이저는 비즈니스를 100% 이해하지 못하기 때문에 개발자나 DBA가 옵티마이저에게 더 좋은 계획을 알려줘야하는 경우가 있다.이 때 다양한 힌트를 제공함으로써 보다 나은 계획을 세울 수 있도록 하는데, 힌트를 아래와 같이 두 가지로 나뉜다.옵티마이저 힌트 : MySQL 5.6 버전부터 새롭게 추가되기 시작한 힌트인덱스 힌트 : 그 외의 힌트 인덱스 힌트MySQL 서버에 힌트가 도입되기 전부터 사용하던 힌트로 문법에 맞도록 작성해야만 한다.기본적으로 ANSI-SQL 표준은 주석으로 힌트를 작성하는 것인데, 인덱스 힌트는 주석으로 작성되지 않는다.또한 인덱스 힌트에서 제공되는 기능이 옵티마이저 힌트에서도 대부분 제공되므로 왠만하면 주석으로 작성되는 옵티마이저 힌트를 사용하는 것이 좋다. STRAIGHT_..

옵티마이저 스위치 옵션옵티마이저 스위치 옵션은 optimizer_switch 시스템 변수를 이용해서 제어한다. 이 변수는 여러 옵션을 같이 설정하게 되는데 아래와 같은 최적화 옵션을 가진다.옵티마이저 스위치 이름기본값설명batched_key_accessoffBKA 조인 알고리즘을 사용할지 여부 설정block_nested_looponBlock Nested Loop 조인 알고리즘을 사용할지 여부 설정engine_condition_pushdownonEngine Condition Pushdown 기능을 사용할지 여부 설정index_condition_pushdownonIndex Condition Pushdown 기능을 사용할지 여부 설정use_index_extensionsonIndex Extension 최적화를 ..

쿼리 실행 절차SQL parsing → parse tree → query plan → physical work옵티마이저는 위의 쿼리 실행 절차 중 parse tree를 기반으로 쿼리 실행 계획을 세우는 역할을 수행한다. 옵티마이저의 자체적인 동작 순서는 아래와 같다.1. 불필요한 조건 제거2. 복잡한 연산 단순화3. 어떤 순서로 테이블을 읽을지 결정4. 어떤 인덱스를 사용할 지 결정5. 임시 테이블을 활용할지 결정6. 실행 계획 생성 옵티마이저의 종류옵티마이저는 크게 두 가지 종류로 분류된다.비용 기반 최적화 (Cost-based Optimizer, CBO)여러 가지 방법을 만들고 비용과 예측통계를 기반같이 쿼리라도 비용이 최소가 되는 방식으로 실행 계획 생성규칙 기반 최적화 (Rule-based Opt..

트랜잭션논리적인 작업이 모두 적용 되거나 아예 적용되지 않아야 함을 보장해주는 것이다. (원자성)트랜잭션을 미지원하는 경우 여러 작업이 동시에 수행될 때 각 작업의 성공, 실패에 대해 모두 대응해야한다. 주의사항트랜잭션 범위는 최소화하는 것이 좋다.1) 처리 시작-- 트랜잭션 시작(BEGIN)2) 사용자 로그인 여부 확인3) 사용자 글쓰기 내용 오류 확인4) 첨부로 업로드된 파일 확인 및 저장# INSERT5) 사용자 입력 내용 DBMS 저장# INSERT6) 첨부파일 정보 DBMS 저장# SELECT7) 저장된 내용 DBMS에서 조회# NETWORK8) 게시물 등록에 대한 알림 메일 발송# INSERT9) 알림 발송 이력 DBMS 저장-- 트랜잭션 종료(COMMIT)10) 처리 완료커넥션을 맺는 시점과..

MySQL의 스토리지 엔진에서 가장 많이 사용되는 InnoDB 엔진을 먼저 살펴보자.다른 엔진에 비하여 InnoDB 엔진의 장점은 레코드 기반 잠금을 제공하여 높은 동시성 처리를 제공한다는 점이다. 기본 키에 의한 클러스터링InnoDB의 모든 테이블들은 기본 키를 기준으로 클러스터링되어 저장된다.(물리적으로 기본 키 순서대로 저장)따라서 옵티마이저가 계획을 세울 때에도 기본 키에 더 높은 비중을 둔다 → 다른 인덱스보다 더 빠름 외래 키 지원외래 키는 실제 운영환경에서는 많이 사용되지 않는다.변경 시 부모/자식 테이블에 데이터가 있는지 체크하여 잠금 전파가 발생하고 데드 락을 유발할 수도 있기 때문이다.foreign_key_checks 시스템 환경변수의 값을 false 로 지정해준다면 체크 작업을 멈출 ..

MySQL은 쿼리를 실행하기 위해서 여러 단계의 과정을 거친다.이 때 동작하는 MySQL 서버를 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다.위 그림에서 이해할 수 있는 부분은 커넥션 핸들러를 통해 들어오는 요청을 SQL 인터페이스, 파서, 옵티마이저, 캐시, 버퍼 등의 모듈을 거쳐 실제 데이터에 대한 작업은 스토리지 엔진이 수행한다는 점이다.(MySQL 엔진은 요청에 대한 전처리 모듈들을 포함하고 있다)MySQL 서버에서 MySQL 엔진은 하나이지만, 스토리지 엔진은 여러 개 일 수있다.예를들어, CREATE TABLE test_table (fd1 INT, fd2 INT) ENGINE=INNODB; 와 같은 쿼리를 입력하면 해당 테이블에 대한 작업에 대해서는 InnoDB가 처리하게된다. 핸..

MySQL 서버 연결 테스트MySQL 서버에 연결 테스트하는 방법은 크게 3가지가 있다.mysql -uroot -p --host=localhost --socket=/tmp/mysql.sockmysql -uroot -p --host=127.0.0.1 --port=3306mysql -uroot -p위 명령어들은 기본적으로 로컬에 설정된 서버에 연결하는 명령어이다.원격 서버로 연결하기 위해서는 2번 명령어의 host 옵션의 값을 원격 서버의 IP 주소로 설정한다.1번 명령어는 소켓 파일을 통해 접속하는 명령어이다. --host=localhost 를 사용하는 경우에는 소켓을 사용하게 되는데, 이 때 이 소켓은 Unix Domain Socket으로 웹 소켓이 아닌 IPC의 일종이다.2번 명령어는 비록 127.0...