개발 공부 기록하기/02. DB & SQL 24

JOIN 쿼리 튜닝

조인과 인덱스 레인지 스캔 조인이 들어간 쿼리 튜닝을 하기 전에, 인덱스 레인지 스캔으로 레코드를 읽는 작업을 다시 한 번 생각해 보아야 한다. 인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다. 이 과정을 인덱스 탐색이라고 한다. 1번에서 탐색된 위치부터 필요한 만큼 인덱스를 쭉~ 읽는다. 이 과정을 인덱스 스캔이라 한다. 2번에서 읽어들인 인덱스 키와 레코드 주소를 이용해 레코드가 저장된 페이지를 가져오고, 최종 레코드를 읽어온다. 일반적으로 인덱스 풀 스캔이나 테이블 풀 스캔 작업은 인덱스 탐색 과정이 거의 없지만 실제 인덱스나 테이블의 모든 레코드를 읽기 때문에 부하가 높다. 하지만 인덱스 레인지 스캔 작업에서는 가져오는 레코드의 건수가 소량이기 때문에 인덱스 스캔 과정은 부하가 작지만 특정 ..

GROUP BY, ORDER BY 인덱스 튜닝

GROUP BY 인덱스 태우기 GROUP BY 절에 명시된 칼럼이 인덱스 칼럼의 순서와 위치가 같아야 한다. 인덱스를 구성하는 칼럼 중에서 뒷쪽에 있는 칼럼은 GROUP BY 절에 명시되지 않아도 인덱스를 사용할 수 있지만 인덱스의 앞쪽에 있는 칼럼이 GROUP BY 절에 명시되지 않으면 인덱스를 사용할 수 없다. GROUP BY 절에 명시된 칼럼이 하나라도 인덱스에 없으면 GROUP BY 절은 전혀 인덱스를 사용하지 못한다. 예시 인덱스 칼럼 순서 : col1, col2, col3, col4 WHERE 조건은 없다 ... GROUP BY col1 # 사용 가능 ... GROUP BY col1, col2 # 사용 가능 ... GROUP BY col1, col2, col3 # 사용 가능 ... GROUP ..

MySQL sql_mode 설정과 옵션

sql_mode 옵션은 SQL의 작성과 결과에 영향을 미치는 옵션이다. 설정보는 법 show variables like 'sql_mode' 설정하는 법 my.cnf (unix 기준) 파일에 sql_mode="XXXXX,YYYY"와 같이 적어줄 수 있다. [mysqld] sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES"Dynamic 옵션이기 때문에 실행 중에도 넣어줄 수 있다. Global, Session 둘다 존재하는 옵션이다. SET sql_mode = 'TRADITIONAL'; 옵션과 의미 STRICT_ALL_TABLES : 일반적으로 MySQL에서는 저장하려는 값의 길이가 칼럼의 길이보다 더 긴 경우라 하더라도 에러가 발생하..

내맘대로 정리하는 Real MySQL #10장) 파티션

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 파티션이란 MySQL 서버 입장에서는 데이터를 별도의 테이블로 분리해서 저장하지만 사용자 입장에서는 여전히 하나의 테이블로 읽기와 쓰기를 할 수 있게 해주는 솔루션이다. 일반적으로 DBMS의 파티션은 하나의 서버에서 테이블을 분산하는 것이며, 원격 서버 간에 분산을 지원하는 것은 아니다. 파티션을 사용하는 이유 한 테이블이 너무 커서 인덱스의 크기가 물리적인 메모리보다 훨씬 크거나, 데이터 특성상 주기적인 삭제 작업이 필요한 경우 등이 파티션이 필요한 대표적인 예이다. 단일 INSERT와 단일 또는 범위 SELECT의 빠른 처리 레코드..

내맘대로 정리하는 Real MySQL #6장) 실행계획 - MySQL 쿼리 동작 방식 편

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? '풀 테이블 스캔'을 제외한 나머지는 모두 스토리지 엔진이 아니라 MySQL 엔진에서 처리되는 내용이다. 또한 MySQL 엔진에서 부가적으로 처리하는 작업은 대부분 성능에 미치는 영향력이 큰데, 안타깝께도 모두 쿼리의 성능을 저하시키는 데 한몫하는 작업이다. 스토리지 엔진에서 읽은 레코드를 MySQL 엔진이 아무런 가공 작업도 하지 않고 사용자에게 반환한다면 최상의 성능을 보장하는 쿼리가 되겠지만, 우리가 필요로 하는 대부분의 쿼리는 그렇지 않다. MySQL 엔진에서 처리하는데 시간이 오래 걸리는 작업의 원리를 알아둔다면 쿼리를 튜닝하..

내맘대로 정리하는 Real MySQL #6장) 실행계획 - 실행계획 읽기 편

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? DBMS에서는 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장돼 있는지 통계 정보를 참조하며, 그러한 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요하다. DBMS에서는 옵티마이저가 이러한 기능을 담당한다. MySQL에서는 EXPLAIN이라는 명령으로 쿼리의 실행 계획을 확인할 수 있다. 옵티마이저 MySQL 서버에서 쿼리가 실행되는 과정은 크게 3가지로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다. SQL의 파싱 정보(파싱 트리)..

내맘대로 정리하는 Real MySQL #5장) 인덱스

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 인덱스는 DB 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다. 이번 장에서는 MySQL 쿼리의 개발이나 튜닝을 설명하기 전에 MySQL에서 사용 가능한 인덱스의 종류 및 특성을 간단히 살펴보겠다. 각 인덱스의 특성과 차이는 상당히 중요하며, 물리 수준의 모델링을 할 때도 중요한 요소가 될 것이다. 5.1 디스크 읽기 방식 DB의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건인 것들이 상당히 많다. 모든 저장 매체는 내부적으로 1개 이상의 디스크 드라이브를 장착하고 있다. 대부분의 저장 매체는 디스크 드라이브의 플래터(디스크 ..

내맘대로 정리하는 Real MySQL #4장) 트랜잭션과 잠금 - 잠금 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 잠금 동시성을 제어하기 위한 기능 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 수행 MySQL 엔진 레벨 잠금과 스토리지 엔진 레벨 잠금 두 가지 종류가 있다. MySQL 엔진의 잠금 글로벌 락 FLUSH TABLES WITH RAED LOCK 명령으로만 획득할 수 있으며, 한 세션에서 글로벌 락을 획득하면 MySQL 서버 전체에 락이 걸린다. 다른 세션은 SELECT을 제외한 대부분의 DDL 문장이나 DML 문장 실행을 대기하게 된다. 테이블 락 개별 테이블 ..

내맘대로 정리하는 Real MySQL #4장) 트랜잭션과 잠금 - 트랜잭션 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 트랜잭션이란 작업의 완전성을 보장해주는 것 논리적인 작업 모음을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다 MEMORY 스토리지 엔진 혹은 MyISAM 스토리지 엔진은 트랜잭션 기능이 없다. 트랜잭션 기능이 없다면 애플리케이션에서 일부의 쿼리만 실행된것에 대한 후처리를 정말 끔찍하게 해야하지만 트랜잭션을 활용하면 try - catch 로 깔끔하게 처리된다. try { START TRANSACTION; INSERT INTO tab_a ...; I..

내맘대로 정리하는 Real MySQL #3장) 아키텍처 - 스토리지 및 MySQL 로그 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? InnoDB 전체 구조 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중에서 거의 유일하게 레코드 기반의 잠금을 제공하고 있으며, 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 엔진의 특성 PK에 의한 클러스터링 : PK 값의 순서대로 디스크에 저장된다는 뜻이며, 이로 인해 PK에 의한 range scan은 상당히 빨리 처리된다 잠금이 필요 없는 일관된 읽기 : MVCC(Multi Version Concurrency Control)이라는 기술을 이용해 락을 걸지 않고 읽기 작업을 수행한다. FK 지원 :..