1. 참조

    1. 참조 블로그: https://jaehoney.tistory.com/62
    2. 연결되는 내용: 컬럼 수에 따른 성능 차이
  2. 파티션이란

    1. 크기가 큰 테이블에 쿼리를 실행할 때, 인덱스를 활용하더라도 부하(풀스캔)가 걸림
    2. MySQL에서는 크기가 큰 테이블을 물리적으로 여러 개로 분할하는 파티션 기능 제공
    3. 예시로 나이대(10대, 20대 등)로 파티셔닝 또는 생성년도 별로 파티셔닝
    4. 파티션을 많이 나누는 경우 시스템 변수 open_file_limit(동시에 열 수 있는 파일 수)를 높게 설정
  3. 파티션 형식

    1. range: 범위(날짜, 나이대 등)를 기준으로 파티셔닝 → 가장 많이 사용
    2. list: 코드나 카테고리 등 특정 값을 기준으로 파티셔닝
    3. hash: 설정한 hash함수를 기준으로 파티셔닝 → range, list 사용이 애매할 때 사용
    4. key: md5() 함수를 이용한 hash 값을 기반으로 파티셔닝 → hash 보다 균등
  4. 파티셔닝 활용

    1. 테이블 생성 + 파티셔닝

      // 테이블 생성과 동시에 파티셔닝 수행
      CREATE TABLE test_user (
      name VARCHAR(20) NOT NULL,
      birth_year INT NOT NULL)
      PARTITION BY RANGE (birth_year) (
      PARTITION part1 VALUES LESS THAN(1970),
      PARTITION part2 VALUES LESS THAN(1980),
      PARTITION part3 VALUES LESS THAN(1990),
      PARTITION part4 VALUES LESS THAN MAXVALUE);
      
    2. 테이블 파티셔닝 이후 재 파티셔닝

      // 파티셔닝이 이루어진 테이블은 추가가 불가능함
      // 대신, 이미 파티셔닝된 테이블을 재 파티셔닝하는 방식으로 추가할 수 있음
      ALTER TABLE test_user
          REORGANIZE PARTITION part4 INTO (
              PARTITION part4 VALUES LESS THAN (2000),
              PARTITION part5 VALUES LESS THAN (MAXVALUE)
          );
      
      // 재구성된 파티션을 적용하려면 OPTIMIZE 테이블문을 사용
      OPTIMIZE TABLE test_user;
      
    3. 파티셔닝 테이블 확인 쿼리

      SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME
      , PARTITION_ORDINAL_POSITION, TABLE_ROWS
      FROM information_schema.PARTITIONS
      WHERE TABLE_NAME = 'test_user';
      
  5. 주의할 점

    1. 파티션 테이블에서는 외래 키 설정할 수 없음
    2. PK, UK가 존재하는 테이블에서는 반드시 파티션에서 사용되는 열도 PK, UK 중 한 가지로 사용
    3. 스토어드 프로시저, 스토어드 함수, 사용자 변수 등을 파티션 식에 사용할 수 없음
    4. 임시 테이블은 파티션을 사용할 수 없음
    5. 파티션 키에는 일부 함수만 사용
    6. MySQL 파티션 개수는 최대 1024개 지원
    7. 레인지 파티션은 연속된 범위를 사용하고 리스트 파티션은 연속되지 않은 값(지역, 상품 코드 등)을 사용