개발 공부 기록하기 108

내맘대로 정리하는 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..

서브쿼리 튜닝

서브쿼리 전반 서브쿼리의 종류 서브쿼리는 두 가지 종류가 있다. 상관서브쿼리 : 서브 쿼리가 독립적으로 실행되지 못하고 외부 쿼리 결과를 기다려야 하는 경우 독립서브쿼리 : 서브 쿼리가 독립적으로 실행될 수 있는 경우.. 하지만 MySQL에서는 독립 서브쿼리라 하더라도 효율적으로 처리되지 못할 때가 많다. 서브쿼리의 제약 사항 서브 쿼리를 IN 연산자와 함께 사용할 때에는 효율적으로 처리되지 못한다. IN 연산자 안에서 사용되는 서브 쿼리에는 ORDER BY와 LIMIT을 동시에 사용할 수 없다. 서브쿼리가 사용되는 곳 SELECT 절에 사용된 서브쿼리 SELECT 절에 사용된 서브쿼리는 내부적으로 임시 테이블을 만든다거나 쿼리를 비효율적으로 실행하도록 만들지는 않기 때문에 서브 쿼리가 적절한 인덱스를 ..

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의 빠른 처리 레코드..

Java InputStream이란?

InputStream OutputStream을 실무에서 사용할 때면, 뭔가 알긴 알고 실제로 둘을 활용해 기능을 구현하는데는 전혀 문제가 없지만, 사용할때마다 찾아보게되고 뭔가 정확히 아는 것 같지는 않다라는 느낌적인 느낌이 있는 친구들이다. 그래서 이번 기회에 화끈하게 InputStream, OutputStream을 파보려고 한다. InputStream의 정의 JDK 11 기준 InputStream의 설명을 읽어보면 This abstract class is the superclass of all classes representing an input stream of bytes 라고 되어 있다. 중요한 부분은 "representing an input stream of bytes"이다. 하나씩 살펴보자. ..

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

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