ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL 관련해 신경쓰면 좋은 것 (feat. 성능)
    Spring Boot/DB 2024. 11. 13. 21:48

     

    1. mysql 5.7.20 → mysql 8.0 아키텍처 변경

    • Query cache가 MySQL 5.7.20부터 depreciated 되고, 8.0을 기점으로 삭제(https://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html)
    • 트래픽 많아지면서 발생하는 DBMS의 Query cache 업데이트 비용과, 운영중 발생하는 캐시 stale 문제가 Query cache 기능을 제공하는 이점 보다 심각하다 판단하여 삭제
    • mysql 버전을 올렸는데 더 느려진 경우가 있는데 Query cache가 없어졌기 때문. 캐시는 애플리케이션 단에 직접 구현해야한다.  


    2. mysql 5.7.20 → mysql 8.0 Storage 엔진

    • query 실행하는 구현체 엔진이 대표적으로 3가지 있었다. (InnoDB, MyISAM, Memory)
    • InnoDB (5.5 이후 표준) : 동시성, 정합성 특화
    • MyISAM(5.5 이전 표준) : 읽기 특화, 트랜잭션 없음
    • Memory (메모리에서 동작하는 메모리 DB)
    • 8.0 오면서 MyISAM으로 된 부분이 다 InnoDB로 마이그레이션 되며 사실상 InnoDB가 표준

     

    3. Charactor set 규칙

    • 문자 인코딩에 쓰이는 값
    • 대표적으로 많이 쓰는 chractor set
      • utf8mb4 (4byte) - 이모지, 공백도 표현
      • utf-8(3-Byte) - 거의 모든 언어 표현가능
    • utf8mb4으로 하면 다국가나 큰서비스는 별의별 문자가 다 입력 되서 필요한 경우 인코딩 설정으로 사전에 막는 것이 좋다.
    • 문자를 어디까지 허용할지 미리 규칙을 정하는 것이 중요하다. (서비스 운영중에 이모지가 들어가면 안되는데 DB 저장 되서 큰 버그가 되는 경우를 경험했다.)

     

    4. Collation 규칙 신경 쓰기

    • 요구사항을 구현하다보면 특정 조건에 따라 내림차순, 오름차순 정렬 할 일이 많다.
    • Collation은 문자열 데이터의 정렬방식, 대소문자 구분 여부를 정의하는 설정이다.
    • collation은 조회 성능에 영향을 미친다. 
      • 특정 언어, 특정 국가에 따라 특화된 정렬방식(= collation)을 제공한다. -> 국가별로 성능 최적화된 정렬 방식을 선택할 수 있다.
        • mysql 8.0 기준 아무 설정 하지 않고 테이블을 만들면 utf8mb4_0900_ai_ci로 기본 생성된다.
        • utf8mb4_0900_ai_ci 은 한국이나 동아시아 국가 언어에서 정렬, 검색 이슈가 있다. (예를 들면 가 = ㄱㅏ 동일하게 취급)
        • [대표적인 collation]
        • `utf8mb4_bin` : 바이트 순서대로 정렬
          • (ex: 'A' < 'B' < 'a' < 'b' )
        • `utf8mb4_general_ci` : ci(= Case Insensitive), 대소문자 구분 없이 비교 및 정렬
          • (ex: 'A' = 'a' < 'B' = 'b')
        • `utf8mb4_unicode_ci` :  general에 더해서 유럽쪽 문자 비교 로직이 추가됨
          • (ex: 'ß' = 'ss')
          • 유럽쪽 다국어 지원이 필요하지 않다면 utf8mb4_general_ci 사용 권장
        • `utf8mb4_0900_ai_ci` : MySQL 8 디폴트 값.
          • 0900: 유니코드 collation algorithm 9.0.0 을 뜻함
          • ai (Accent Insensitive) : 외국어에서 사용하는 악센트 기호가 있을 때 구분 없이 동일한 글자로 취급
          • ci (Case Insensitive) : 대소문자 구분 없음
      • collation은 테이블 level, column level로 선언할 수 있다. join시 반드시 collaction은 통일되어야 한다. (통일 되지 않으면 서로 다른 문자로 인식한다. )
      • 가장 많이 사용되는 3가지 collation 성능 비교 

    https://bommbom.tistory.com/entry/MySQL%EC%97%90%EC%84%9C-%EC%BA%90%EB%A6%AD%ED%84%B0%EC%85%8B%EC%9D%98-collation%EC%9D%B4-%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94?category=1066931


     

    5. 내림차순 인덱스

    - Mysql 8.0 이후에는 내림차순 인덱스를 제공한다. 대부분의 게시글은 createdAt desc 조건이다. 
    - 적용하게 되면 성능적으로 이점을 얻을 수 있다. 
     
    https://neverfadeaway.tistory.com/71

     

    Real MySQL 8.0 8장 - 인덱스 정렬 및 스캔의 방향

    인덱스 생성시 기본적으론, 오름차순(ASC) 정렬로 인덱스가 생성된다. mysql 5.7 버전 이후의 버전에서 인덱스 생성 시, 인덱스를 구성하는 컬럼의 정렬 순서를 정 할 수 있다. 5.7 버전에서는 인덱스

    neverfadeaway.tistory.com

     

    반응형
Designed by Tistory.