-
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 성능 비교
- 특정 언어, 특정 국가에 따라 특화된 정렬방식(= collation)을 제공한다. -> 국가별로 성능 최적화된 정렬 방식을 선택할 수 있다.
5. 내림차순 인덱스
- Mysql 8.0 이후에는 내림차순 인덱스를 제공한다. 대부분의 게시글은 createdAt desc 조건이다.
- 적용하게 되면 성능적으로 이점을 얻을 수 있다.
https://neverfadeaway.tistory.com/71반응형'Spring Boot > DB' 카테고리의 다른 글
MySQL - 외래키(Foreign Key)를 써야할까? (1) 2024.08.14 Kafka 기본개념 정리 (0) 2024.04.16 DB Replication이란? 사용 이유 (0) 2024.03.19 [DB] UUID를 고유 값이나 Key로 사용하면 안되는 이유 (0) 2023.06.30 [DB] ACID란? Transaction이란? (0) 2023.06.28