보라코딩
MySQL 성능 최적화 본문
*** 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 |