MySQL
-
Real MySQL [7-16] 쿼리 작성 및 최적화 - GROUP BY(2)MySQL 2017. 3. 24. 23:29
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. 레코드를 칼럼으로 변환해서 조회 GROUP BY나 집합 함수를 통해 레코드를 그룹핑 할 수 있지만 하나의 레코드를 여러 개의 칼럼으로 나누거나 변환하는 SQL 문법은 없다. 하지만 SUSM(), COUNT()와 같은 집합 함수와 CASE WHEN .. END 구문을 이용해 레코드를 칼럼으로 변환하거나 하나의 칼럼을 조건으로 구분해서 2개 이상의 칼럼으로 변환하는 것은 가능하다. 우선 다음과 같이 dept_emp 테이블을 이용해 부서별로 사원의 수를 확인하는 쿼리를 생각해 보자. SELECT dept_no, COUNT(*) AS emp_..
-
Real MySQL [7-15] 쿼리 작성 및 최적화 - GROUP BYMySQL 2017. 3. 10. 21:28
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. GROUP BY 사용 시 주의사항 쿼리에 GROUP BY가 사용되면 그룹 키(GROUP BY 절에 명시된 칼럼)가 아닌 칼럼은 일반적으로 집합 함수를 감싸서 사용해야 한다. 오라클과 같은 DBMS 에서는 이 규칙을 지키지 않으면 에러가 난다. 하지만 MySQL에서는 그룹 키가 아닌 칼럼이더라도 쿼리에서 집합 함수 없이 그냥 사용할 수 있다. SELECT first_name FROM employees GROUP BY gender; SELECT first_name, last_name, COUNT(*) FROM employees GROUP ..
-
Real MySQL [7-14] 쿼리 작성 및 최적화 - Delayed JoinMySQL 2017. 2. 22. 21:46
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. 지연된 조인(Delayed Join) 조인을 사용하는 쿼리에서 GROUP BY 또는 ORDER BY를 사용할 때 인덱스를 사용한다면 이미 최적으로 처리되고 있을 가능성이 높다. 하지만 그러지 못하다면 MySQL 서버는 우선 모든 조인을 실행하고 난 다음 GROUP BY나 ORDER BY를 처리할 것이다. 조인은 대체적으로 실행되면 될수록 결과 레코드 건수가 늘어난다. 그래서 조인의 결과를 GROUP BY 하거나 ORDER BY 하면 조인을 실행하기 전의 레코드를 GROUP BY나 ORDER BY를 수행하는 것보다 많은 레코드를 처리해야..
-
Real MySQL [7-13] 쿼리 작성 및 최적화MySQL 2017. 2. 17. 23:27
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. INNNER JOIN과 OUTER JOIN의 선택 INNER JOIN은 조인의 양쪽 테이블 모두 레코드가 존재하는 경우에만 레코드가 반환된다. 하지만 OUTER JOIN은 아우터 테이블에 존재하면 레코드가 반환된다. 쿼리나 테이블의 구조를 살펴보면 OUTER JOIN을 사용하지 않아도 될 것을 OUTER JOIN으로 사용할 때가 상당히 많다. 때로는 OUTER JOIN으로 실행하면 쿼리의 처리가 느려진다고 생각하고, 억지로 INNER JOIN으로 쿼리를 작성하려는 경우도 있다. 사실 OUTER JOIN과 INNER JOIN은 실제 가져..
-
Real MySQL [7-12] 쿼리 작성 및 최적화 - OUTER JOINMySQL 2017. 2. 15. 20:21
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. OUTER JOIN 주의사항 OUTER JOIN에서 OUTER로 조인되는 테이블의 칼럼에 대한 조건은 모두 ON절에 명시해야 한다. 조건을 ON 절에 명시하지 않고 다음 예제와 같이 OUTER 테이블의 칼럼이 WHERE 절에 명시하면 옵티마이저가 INNER JOIN과 같은 방법으로 처리한다. SELECT * FROM employees e LEFT JOIN dept_manager mgr ON mgr.emp_no=e.emp_no WHERE mgr.dept_no='d001'; 위의 쿼리는 ON 절에 조인 조건은 명시했지만 OUTER로 조인되..
-
Real MySQL [7-11] 쿼리 작성 및 최적화 - JOINMySQL 2017. 2. 14. 20:20
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. 이번 포스팅에서는 JOIN이 어떻게 인덱스를 사용하는지에 대해 각 쿼리 패턴별로 자세히 살펴보자. JOIN의 순서와 인덱스 인덱스 레인지 스캔으로 레코드를 읽는 순서를 정리해보자 1) 인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다. 이 과정을 인덱스 탐색(Index seek)이라고 한다. 2) 1번에서 탐색된 위치부터 필요한 만큼 인덱스를 죽 읽는다. 이 과정을 인덱스 스캔(Index scan)이라고 한다. 3) 2번에서 읽어들인 인덱스 키와 레코드 주소를 이용해 레코드가 저장된 페이지를 가져오고, 최종 레코드를 읽어온다. 인덱..
-
Real MySQL [7-10] 쿼리 작성 및 최적화 - WHERE 절의 비교 조건 사용 시 주의사항MySQL 2017. 2. 8. 23:36
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. DISTINCT 특정 칼럼의 유니크한 값을 조회할때 SELECT 쿼리에 DISTINCT를 사용한다. DISTINCT는 MIN(), MAX(), COUNT()와 같은 집합 함수와 함께 사용하는 경우와, 집합 함수가 없이 사용하는 경우 두 가지로 구분된다. 두가지 경우로 구분하는 이유는 DISTINCT 키워드가 영향을 미치는 범위가 달라지기 때문이다. 집합 함수와 같이 DISTINCT가 사용되는 쿼리는 실행 계획에서 DISTINCT 처리가 인덱스를 사용하지 못할 때는 항상 임시 테이블이 있어야 한다. SELECT DISTINCT SELEC..
-
Real MySQL [7-9] 쿼리 작성 및 최적화 - WHERE 절의 비교 조건 사용 시 주의사항MySQL 2017. 1. 31. 20:28
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. NULL 비교 다른 DBMS와는 달리 MySQL 에서는 NULL값이 포함된 레코드도 인덱스로 관리된다. 이는 인덱스에서는 NULL을 하나의 값으로 인정해서 관리한다는 것을 의미한다. SQL 표준에서 NULL 정의는 비교가 불가해서 두 값이 모두 NULL을 가진다고 하더라도, 이 두 값이 같은지 비교하는 것은 불가능하다. 연산이나 비교에서 한쪽이라도 NULL 이면 그 결과도 NULL이 반환되는 이유가 바로 여기에 있다. NULL인지 비교하려면 "IS NULL" 연산자를 사용해야 한다. 그 밖의 방법으로는 칼럼의 값이 NULL 인지 알 수..