kimyu0218
  • [mysql] 성능 최적화 3편 (데이터 크기)
    2024년 02월 13일 15시 36분 22초에 업로드 된 글입니다.
    작성자: @kimyu0218

    데이터 구조 최적화

    테이블을 설계할 때 적절한 데이터 타입을 설정하는 것이 매우 중요하다. 최소한의 데이터 크기를 사용함으로써 테이블이 차지하는 디스크 공간을 최적화할 수 있고, 데이터가 메모리에 로드될 때 메모리 공간을 적게 사용하기 때문에 더 많은 데이터를 캐싱할 수 있다.

     

    데이터 크기 최적화

    데이터 크기를 최적화하면 디스크에 저장되는 데이터 양을 줄일 수 있다. 이는 저장소 비용을 절감하고 데이터 전송 시간을 단축시킨다.

     

    테이블 컬럼 최적화

    • 작은 크기의 데이터 타입을 사용하여 디스크 공간과 메모리를 확보한다.
    • 가능한 `NOT NULL`로 선언하여 각 값이 null인지 테스트하는 오버헤드를 제거한다.
      `TINYINT` `SMALLINT` `MEDIUMINT` `INT` `BIGINT`
    바이트 1 2 3 4 8
    특정 컬럼의 값을 문자와 숫자로 모두 표현할 수 있는 경우, 숫자형을 권장한다. 숫자형은 문자형보다 더 적은 바이트를 사용하기 때문에 작은 공간을 차지한다. 이로 인해 데이터베이스의 용량을 절약하고 데이터 조회 속도를 향상시킬 수 있다. 또한 숫자형을 사용하면 수치 연산이나 집계 함수를 사용할 수 있으므로 분석 작업에 유리하다.
      `CHAR` `VARCHAR` `BINARY` `VARBINARY`
    길이 0 ~ 255 0 ~ 65535 0 ~ 255 0 ~ 65535
    타입 문자열 이진 데이터
    💡 CHAR vs. VARCHAR
    • CHAR 열의 길이는 고정 길이 문자열로, 지정된 길이만큼의 공간을 할당하여 값이 지정된 길이보다 짧으면 지정된 길이까지 공백을 패딩하여 저장한다.
    • VARCHAR은 가변 길이 문자열로, 값을 저장할 때 패딩을 사용하지 않는다. (실제 데이터만 저장!)
    • 디스크와 메모리 공간을 절약하기 위해서는 VARCHAR를 사용하는 것이 좋지만, VARCHAR은 길이가 가변적이기 때문에 인덱스 성능이 조금 떨어질 수 있다.
    💡 문자형 최적화
    • 문자열을 빠르게 비교하고 정렬하기 위해 BINARY 타입을 사용한다.
    • 값들을 비교할 때 가능한면 동일한 인코딩을 갖도록 하여 문자열 변환을 최소화한다.
             
      `TINY*` `*` `MEDIUM*` `LONG*`
    종류 `TINYBLOB`
    `TINYTEXT`
    `BLOB`
    `TEXT`
    `MEDIUMBLOB`
    `MEDIUMTEXT`
    `LONGBLOB`
    `LONGTEXT`
    💡 ENUM 타입을 사용해야 하는 이유
    • 저장 공간 최적화 : 컬럼에 저장되는 값의 수에 따라 저장공간을 최적화한다. 최대 255 종류의 값이 있는 열거형의 경우, 1바이트를 사용한다.
    • 데이터 무결성 강화 : 컬럼에 저장할 수 있는 값의 목록이 미리 정의되어 있으므로 허용된 값 이외의 값이 삽입되는 것을 방지할 수 있다.

     

    인덱스 최적화

    • 테이블의 기본 인덱스는 최대한 짧아야 한다. InnoDB의 경우, 기본 키를 각 보조 인덱스에 중복으로 포함시키므로, 보조 인덱스가 많은 경우 짧은 기본 키를 사용하면 상당한 공간을 절약할 수 있다.
    • 필요한 인덱스만 생성한다. 인덱스는 조회 성능을 향상시키지만 삽입 및 업데이트 작업을 느리게 할 수 있다. 따라서 주로 특정 열의 조합으로 검색하는 경우, 각 열에 대해 별도의 인덱스를 생성하는 대신 단일 복합 인덱스를 만드는 것을 권장한다.
    • 먄약 인덱스의 처음 몇 글자가 고유할 가능성이 높다면, 해당 접두사에 인덱스를 생성하는 것이 좋다. 짧은 인덱스는 조회 성능을 향상시키면서 디스크와 메모리 공간도 절약할 수 있다.

     

    조인 최적화

    • 자주 조회하는 테이블을 분리하여 검색 성능을 향상시킬 수 있다. 특히 데이터가 자주 갱신되는 경우, 테이블을 분리함으로써 인덱스 관리와 백업 및 복원 등의 작업이 훨씬 쉬워진다.
    • 간결한 컬럼 이름을 사용하면 서로 다른 테이블에서 동일한 이름을 사용하여 조인 쿼리를 단순화*할 수 있다. 이는 직접적으로 성능에 영향을 미치진 않지만 유지 보수성과 가독성을 향상시키는데 도움을 준다.

     

    정규화 최적화

    • 정규화를 통해 데이터를 중복으로 저장하는 것을 방지한다.
    • 하지만 속도가 공간보다 중요한 경우, 의도적으로 정규화 규칙을 위배하여 데이터의 복사본을 만들거나 요약 테이블을 생성할 수 있다.

    참고자료

    댓글