보라코딩

MySQL 성능 최적화 본문

코딩/DB

MySQL 성능 최적화

new 보라 2024. 7. 23. 12:40

*** MySQL 성능 최적화 ***

- MySQL 기본이 지연로딩. 필요할 때까지 데이터를 로드하지 않아 초기 로딩 시간 줄이고 성능 향상

- 조인 쿼리에서 성능을 최적화하려면 작은 테이블을 Driving Table로 사용하는 것이 좋습니다. 작은 테이블을 사용하면 검색 범위가 줄어들어 전체 쿼리의 성능이 향상

- WHERE 절에 정규식을 사용하면 테이블 풀 스캔이 발생하여 성능이 저하됩니다. 따라서 피하는 것이 좋음

- 백만건 이상 데이터부터 성능 최적화 필요

- 문제: LIKE 연산자에서 '%abc' 패턴을 사용하면 인덱스를 사용할 수 없어서 풀 스캔이 발생
   ㄴ 해결책: 'abc%' 패턴을 사용하면 인덱스를 활용할 수 있음
   ㄴ 추가 팁: LIKE 연산자를 사용하기 전에 WHERE 절이나 조인, 서브쿼리 등을 통해 검색 집합을 작게 만드는 것이 좋음
   ㄴ 예시: firstname, lastname 등을 분리하여 인덱스를 타게 할 수 있음
   
- 컬럼을 캐스팅하면 인덱스 동작 안함  ex) 날짜를 string에 넣으면 안됨. timestamp형식으로

- between은 연속성 있을때, in은 듬성듬성 확실하게 읽을 때

- Short circuit Evaluation : 논리 연산자 && (AND)와 || (OR)에서 피연산자를 평가할 때 가능한 최소한의 평가만 수행하는 기법

- count(*)는 인덱스 사용 가능. 성능 부담없는 작업

- Redo 로그와 Undo 로그
   ㄴ Redo 로그: 트랜잭션의 변경 사항을 기록하여 데이터베이스 복구를 돕습니다.
   ㄴ Undo 로그: 트랜잭션을 롤백할 때 사용됩니다.
   ㄴ Note: INSERT 시에는 주로 Redo 로그에 기록되고, Undo 로그는 사용되지 않습니다.

- 트랜잭션을 사용해서 여러개를 한번에 commit하면 속도 빠름
   ㄴ 이유 : 로그 버퍼에 임시 저장 후에 한번에 디스크에 기록하기 때문에 매번 쓰지 않아서 속도 빠름 (추가 검색)
         : 지연된 쓰기로 즉시 디스크에 쓰지 않고 메모리 내 버퍼 풀에 저장 후 비동기적으로 디스크에 기록하기 때문
 : 즉, 디스크 쓰기 횟수가 줄어들어 트랜잭션 처리 속도 빠름
 
- 트랜잭션으로 묶어 한 번에 커밋하면 성능 향상
   ㄴ 로그 버퍼: 변경 사항을 로그 버퍼에 임시 저장한 후 한 번에 디스크에 기록하여 디스크 I/O를 줄임
   ㄴ 지연된 쓰기: 변경 사항을 메모리 내 버퍼 풀에 저장하고, 비동기적으로 디스크에 기록하여 트랜잭션 처리 속도를 빠르게 함

- Zero Offset Query : LIMIT 절을 사용하는 대신(limit 사용시 건너 뛰기전에 행을 읽음), WHERE 절을 사용하여 특정 오프셋 이후의 데이터를 가져오면 성능이 향상. 예를 들어, WHERE id > 10000과 같이 사용(필요하지 않은 행 읽지 않음)

'코딩 > DB' 카테고리의 다른 글

sqld 공부했던 자료.zip  (0) 2024.11.20
MySQL 옵티마이저  (0) 2024.06.28
Postgres 장점 (MVCC)  (0) 2024.06.13
docker로 oracle 사용하기  (0) 2023.10.15
몽고DB 설치  (0) 2023.08.25