콘텐츠로 이동

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을 사용하려면...
      1. 각 쿼리의 SELECT 절 칼럼의 갯수 및 데이터 타입이 일치할 것
      2. 대응하는 칼럼 명이 같아야 함 (별칭 사용 가능)
      3. ORDER BY 절은 마지막에 한 번 사용 가능
  • UNION
    • UNION은 구문을 병합하는 과정에서 중복 데이터가 사라짐
    • UNION DISTINCT를 줄여서 사용하는 것이라고 함
      SELECT STU_EMAIL AS EMAIL FROM MEMBER
      UNION
      SELECT MEM_EMAIL AS EMAIL FROM MEMBER;
      
      -- EMAIL
      joel.jo@jo.com
      illit@h.com
      cherish@j.co
      
  • UNION 내부 동작
    • 중복 제거는 내부적으로 각 레코드의 중복을 확인하는 절차를 가짐
    • 절차
      1. UNION [ALL|DISTINCT] 결과에 적합한 임시 테이블을 메모리 테이블로 생성
      2. UNION(DISTINCT) 의 경우, Temporary 테이블의 모든 컬럼으로 Unique Hash 인덱스 생성
      3. 서브쿼리 1 실행 후 결과를 Temporary 테이블에 복사
      4. 서브쿼리 2 실행 후 결과를 Temporary 테이블에 복사
      5. 3,4번 과정에서 Temporary 테이블이 특정 사이즈 이상으로 커지면 Temporary 테이블을 Disk Temporary 테이블로 변경 (이럼 느려지겠네)
        • 이때 Unique Hash 인덱스는 Unique B-Tree 인덱스로 변경
      6. Temporary 테이블을 읽어 Client에 결과 전송
      7. Temporary 테이블 삭제
    • 2번의 절차 때문에, UNION 보다 UNION ALL이 데이터 건수에 따라 다르지만 1.5~4배 성능 차이
  • UNION ALL
    • UNION ALL은 중복 데이터를 포함하여 병합
    • 중복 제거 안하니, UNION 보다 빠르다고 함
      SELECT STU_EMAIL AS EMAIL FROM MEMBER
      UNION ALL
      SELECT MEM_EMAIL AS EMAIL FROM MEMBER;
      
      -- EMAIL
      joel.jo@jo.com
      illit@h.com
      joel.jo@jo.com
      cherish@j.co
      
  • UNION vs JOIN
    • JOIN: ON 조건으로 테이블을 연결
    • UNION : 테이블 연결 없이 그냥 합쳐서 보여주는 느낌
  • 알아두기
    • 근데 이거 UNION/UNION ALL 둘다 그리 썩 좋은 방식은 아님
      • UNION 이 필요하단건 통합되어야 할 엔티티가 모종의 이유로 분리되어 이렇게 쿼리를 쓸 수 밖에 없었던 것...
    • 써야 한다면, 중복 없다는 가정하엔 UNION ALL 쓰자.
      • 중복이 있더라도 문제 없으면 UNION ALL 쓰자.
    • UNION/UNION ALL 쓸 때는 최소 컬럼만 SELECT 하자