2024 10 24
2024-10-24¶
MySQL UNION/UNION ALL¶
참고: https://mooonstar.tistory.com/entry/MySQLUNION-UNION-ALL%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%91%ED%95%A9-%EA%B5%AC%EB%AC%B8-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
참고: https://priming.tistory.com/115
참고: https://jmkim.tistory.com/50
참고: https://intomysql.blogspot.com/2011/01/union-union-all.html
-
개요
- 두 개 이상의 조회 결과를 병합하는 경우
table: MEMBER | MEM_ID | MEM_NAME | MEM_EMAIL | MEM_ADDRESS | -------------------------------------------------------------- | 100004 | joel.jo | joel@jo.com | addrees2 | | 100006 | illit.ch | illit@h.com | address1 | table: STUDENT | STU_ID | STU_NAME | STU_EMAIL | STU_ADDRESS | -------------------------------------------------------------- | 100004 | joelonsw | joel@jo.com | addrees3 | | 100006 | illit | cherish@j.co | address4 |
- UNION/UNION ALL을 사용하려면...
- 각 쿼리의 SELECT 절 칼럼의 갯수 및 데이터 타입이 일치할 것
- 대응하는 칼럼 명이 같아야 함 (별칭 사용 가능)
- ORDER BY 절은 마지막에 한 번 사용 가능
- 두 개 이상의 조회 결과를 병합하는 경우
- UNION
- UNION은 구문을 병합하는 과정에서 중복 데이터가 사라짐
- UNION DISTINCT를 줄여서 사용하는 것이라고 함
- UNION 내부 동작
- 중복 제거는 내부적으로 각 레코드의 중복을 확인하는 절차를 가짐
- 절차
- UNION [ALL|DISTINCT] 결과에 적합한 임시 테이블을 메모리 테이블로 생성
- UNION(DISTINCT) 의 경우, Temporary 테이블의 모든 컬럼으로 Unique Hash 인덱스 생성
- 서브쿼리 1 실행 후 결과를 Temporary 테이블에 복사
- 서브쿼리 2 실행 후 결과를 Temporary 테이블에 복사
- 3,4번 과정에서 Temporary 테이블이 특정 사이즈 이상으로 커지면 Temporary 테이블을 Disk Temporary 테이블로 변경 (이럼 느려지겠네)
- 이때 Unique Hash 인덱스는 Unique B-Tree 인덱스로 변경
- Temporary 테이블을 읽어 Client에 결과 전송
- Temporary 테이블 삭제
- 2번의 절차 때문에, UNION 보다 UNION ALL이 데이터 건수에 따라 다르지만 1.5~4배 성능 차이
- UNION ALL
- UNION ALL은 중복 데이터를 포함하여 병합
- 중복 제거 안하니, UNION 보다 빠르다고 함
- UNION vs JOIN
- JOIN: ON 조건으로 테이블을 연결
- UNION : 테이블 연결 없이 그냥 합쳐서 보여주는 느낌
- 알아두기
- 근데 이거 UNION/UNION ALL 둘다 그리 썩 좋은 방식은 아님
- UNION 이 필요하단건 통합되어야 할 엔티티가 모종의 이유로 분리되어 이렇게 쿼리를 쓸 수 밖에 없었던 것...
- 써야 한다면, 중복 없다는 가정하엔 UNION ALL 쓰자.
- 중복이 있더라도 문제 없으면 UNION ALL 쓰자.
- UNION/UNION ALL 쓸 때는 최소 컬럼만 SELECT 하자
- 근데 이거 UNION/UNION ALL 둘다 그리 썩 좋은 방식은 아님