MySQL 11

내맘대로 정리하는 Real MySQL #7장) 쿼리 작성 및 최적화

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 이번 장에서는 쿼리의 각 패턴별로 "어떻게 처리되는가?"를 살펴보겠다. 또한 많이 알려져 있지 않지만 프로그램 코드를 상당히 줄일 수 있는 유용한 쿼리 패턴도 함께 살펴보겠다. 내맘대로 정리하고 싶었으나, 페이지 수가 무려 180p인 크고 아름다운 Chapter라서 필요하다면 세부 주제별로 잘개 쪼개 정리해보았다. (앗 생각해보니 어차피 내맘대로구나..!) 쿼리와 연관된 시스템 설정 lannstark.tistory.com/38 MySQL sql_mode 설정과 옵션 sql_mode 옵션은 SQL의 작성과 결과에 영향을 미치는 옵션이다...

MySQL DDL 총 모음

업무를 진행하면서 간혹 DDL을 써야 할 때가 있는데, 그때마다 구글 검색을 하는 것이 여간 번거로운 일이 아니다. 때문에 아싸리 총 정리를 해서 여기만 보려고 한다. 혹시 저처럼 구글 검색이 귀찮으신 분이 계시다면 이 페이지 즐겨찾기 추천드립니다 ^^,, 빠진 DDL이 있다면 댓글로 알려주세요! 추가하겠습니다 :) DB의 구조 및 정의를 생성하거나 변경하는 쿼리를 DDL이라 한다. 데이터 베이스 DB 생성 CREATE DATABASE [IF NOT EXISTS] employees; CREATE DATABASE [IF NOT EXISTS] employees CHARACTER SET utf8; CREATE DATABASE [IF NOT EXISTS] employees CHARACTER SET utf8 CO..

MySQL 교집합과 차집합

MySQL에서는 INTERSECT와 MINUS 연산을 지원하지 않는다. 어떻게 하면 다른 쿼리를 같은 효과를 낼 수 있는지 알아보자..! INTERSECT SELECT emp_no FROM dept_emp WHERE dept_no = 'd001' INTERSECT SELECT emp_no FROM dept_emp WHERE dept_no = 'd002'; INNER JOIN을 사용할 수 있다. SELECT de1.emp_no FROM dept_emp de1 INNER JOIN dept_emp de2 ON de2.emp_no = de1.emp_no AND de2.dept_no = 'd001' WHERE de1.dept_no = 'd002'; MINU..

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 #6장) 실행계획 - MySQL 쿼리 동작 방식 편

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

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

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

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

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

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

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? MySQL 전체 구조 MySQL 엔진 커넥션 핸들러 : 클라이언트로부터의 접속 및 쿼리 요청 처리 SQL 파서 및 전처리기 옵티마이저 : 쿼리의 최적화된 실행에 도움 성능 향상을 위한 MyISAM의 키 캐시나 InnoDB같은 보조 저장소 기능 스토리지 엔진 : 실제 데이터를 디스크에 저장하거나 디스크로부터 데이터를 읽어오는 부분 핸들러 요청 : MySQL 엔진 → 스토리지 엔진에 보내는 요청 핸들러 API : 핸들러 요청에서 사용되는 API, SHOW GLOBAL STATUS LIKE 'Handler%'로 확인 가능하다. 스레드 구조..