b

7.4.7 GROUP BY, ORDER BY, 7.4.9 서브쿼리 본문

RealMysql

7.4.7 GROUP BY, ORDER BY, 7.4.9 서브쿼리

dev.bistro 2013. 1. 7. 17:58

7.4.7 GROUP BY

- "특정 칼럼의 값으로 레코드를 매핑", "각 그룹의 집계된 결과를 하나의 레코드로 조회할 때 사용"


* MySQL은 그룹 키가 아닌 칼럼이더라도 집합함수없이 GroupBy에 사용할 수 있지만, 제대로 된 사용은 아니다.

- SELECT  first_name FROM employees GROUP BY gender;

-- gender로 그루핑을 해서 M/F 2개의 결과로 묶지만 SELECT는 first_name이다. 이게 M/F그루핑한것중 최소/최대/중간값인지 알수없다.

-- "이러한 사용은 가독성 저하" ==> 반드시 GROUP BY에 명시되지 않은 칼럼은 집합함수로 감싸라.

-- 이렇게 집합함수를 감싸서 사용할 수 있게 하는것을 'FULL_GROUP_BY' , 옵션으로 enable가능하다.


* GROUP BY .. ORDER BY NULL

- MySQL의 GROUP BY는 '그루핑 칼럼 순'으로 정렬까지 수행한다. 정렬이 필요없다면 "ORDER BY NULL"을 추가


* GROUP BY col1 ASC col2 DESC

- MySQL의 GROUP BY가 정렬도 수행하기 때문에 이처럼 정렬 순서도 명시할 수 있다.

- 이것도 ORDER BY와 동일하기 때문에, 정렬순서가 혼용되면 인덱스 사용이 불가능하다.

- 많은 사용자가 익숙치 않기 때문에 그냥 ORDER BY에서 사용하자.


* GROUP BY .. WITH ROLLUP

- 그루핑된 그룹별로 TOTAL COUNT를 가져올수 있는 기능.


* 레코드를 칼럼으로 변환해서 조회

- 레코드를 칼럼으로 변경

- 하나의 칼럼을 여러 칼럼으로 분리 을 할 수 있다 (ref: 468page)


7.4.8 ORDER BY

* 만약 ORDER BY가 없다면 기본 정렬 상태는 ?

- 인덱스를 사용하면, 인덱스의 정렬 순서대로

- 인덱스 사용 X, 풀테이블 스캔

-- MyISAM : 저장된 순, 단 INSERT순은 아니다. 빈 공간이 있으면 거기에 저장하기 때문

-- InnoDB : 항상 PK로 클러스트링 되어서, 풀 스캔의 경우 기본 PK 순으로 가져옴

- SELECT가 임시테이블을 거친다면 순서를 예측할 수 없다.



* ORDER BY 사용법 및 주의사항

- ORDER BY 2 : 2번째 필드로 정렬

- ORDER BY "var" : MySQL은 ""로 묶인 문자열은 무시한다. <- 주의하자.


* ORDER BY RAND()

- 단순추첨, 임의사용자 조회를 위한 가장 단순한 방법

- '절대' 인덱스를 이용할 수 없다.


* 여러 방향으로 동시 정렬

- 오름/내림차순이 혼용되면 인덱스를 이용할 수 없다.

- 숫자타입은 반대부호를 붙여서 소팅에 이용할 수 있다(ref 471page)

- 또는 여러 쿼리로 나누어서 처리를 한다.

-- 두번째쿼리에 반복횟수가 작은 경우

-- 정렬갯수가 많아서 디스크를 이용할 경우 유용하다.


* 함수나 표현식을 이용한 정렬

- SELECT * FROM e ORDER BY emp_no+10 처럼 식은 인덱스 이용안됨


* ORDER BY를 튜닝하기 힘들때는 WHERE을 최적화해서 건수를 최대한 줄인다.




7.4.9 서브쿼리

- 가독성은 좋지만, 최적실행은 되지 않는다.


* Correlated subquery

 - 외부에서 정의된 테이블을 참조해서 검색을 수행

 - 독립적으로 실행되지 않고, 외부테이블 이후 순차실행


* Self-Contained subquery

 - 외부쿼리와 상관없이 항상 같은 값을 반환

 - 외부 쿼리보다 먼저 실행 => 외부 검색을 위한 상수로 사용됨이 일반적


* 서브쿼리의 제약 사항

 - LIMIT 절은 사용할 수 없다.

 - 서브쿼리를 이용해 한 테이블을 동시에 읽고/쓰기 할 수 없다.


* SELECT 절에 사용된 서브 쿼리

- 일반적으로 SELECT에 사용된 서브쿼리는 결과가 1개를 반환해야한다.


* FROM 절에 사용된 서브 쿼리

- FROM 절에 사용된 서브 쿼리는 항상 임시테이블을 사용, 비유율적일때가 많다.

- 서브쿼리가 반환하는 결과가 크거나, 대용량 칼럼이 있다면 디스크에 임시테이블을 만들고, 병목이 생긴다.

 




Comments