일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 플레이 프레임워크
- aws
- spring-cloud-stream
- statestore
- RabbitMQ
- enablekafkastreams
- scala 2.10
- scala
- Elasticsearch
- springboot
- kafkastream
- Spring
- spring-batch
- Kafka
- Slick
- confluent
- 카프카
- gradle
- kafkastreams
- 한빛미디어
- Logstash
- kafka interactive query
- avo
- coursera
- reactive
- schema registry
- spring-kafka
- Elk
- play framework
- kafka streams
- Today
- Total
b
7.4.7 GROUP BY, ORDER BY, 7.4.9 서브쿼리 본문
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 절에 사용된 서브 쿼리는 항상 임시테이블을 사용, 비유율적일때가 많다.
- 서브쿼리가 반환하는 결과가 크거나, 대용량 칼럼이 있다면 디스크에 임시테이블을 만들고, 병목이 생긴다.
'RealMysql' 카테고리의 다른 글
Mysql partition 사용이유,제한,주의사항등... (2) | 2013.09.25 |
---|---|
7.4.6. JOIN (0) | 2013.01.04 |
[기타] MySQL InnoDB Engine 사용 시 반드시 알아야 할 세 가지 (0) | 2013.01.04 |
7.4.SELECT ( 7.4.3 WHERE ~ 7.4.5 LIMIT ) (0) | 2012.12.11 |
7.4 SELECT ( 7.4.1 SELECT 처리순서 ~ 7.4.2 GROUP BY, ORDER BY) (1) | 2012.12.09 |