Zero to Hero
article thumbnail
Real MySQL 02
Review 2021. 5. 29. 20:18

InnoDB 버퍼 풀 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시 해 두는 공간 쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼 역할 변경된 데이터를 모아서 처리하게 되면 랜덤 디스크 I/O 횟수를 줄일 수 있다. Undo 로그 쿼리로 인해 데이터를 조작해 변경했을 때 변경되기 전 데이터를 보관하는 곳 즉 쿼리 a로 데이터 b를 변경한다면 변경 전 데이터를 Undo 로그에 보관한다. 이후 정상적으로 COMMIT이 발생하면 변경된 데이터를 물리 공간에 반영하고, ROLLBACK이 발생하면 Undo 영역의 백업된 데이터를 다시 데이터 파일(데이터/인덱스 버퍼)로 복구한다. 추가적으로 트랜잭션의 격리 수준을 유지하면서 높은 동시성을 제공하는 데 사용하기도 한다. Insert 버퍼 쿼리..

article thumbnail
Real MySQL 01
Review 2021. 5. 29. 19:54

쿼리 캐시 - 타 DBMS에 없는 MySQL의 독특한 기능 - 실행된 결과를 쿼리 캐시에 담아 두고, 동일한 쿼리 요청이 왔을 때 간단하게 쿼리 캐시에서 찾아서 바로 결과를 내려 줌 - 쿼리를 캐싱하는 것이 아니라 쿼리의 결과를 메모리에 캐싱하는 기능 - 쿼리 캐시는 기본적으로 KEY, VALUE의 Map 형태이고 KEY가 쿼리, VALUE가 해당 쿼리에 대한 결괏값이다. 쿼리 캐시를 이용해 결과를 얻을 때 확인할 것 1. 요청된 쿼리 문장이 쿼리 캐시에 존재하는가? Map에서 입력된 쿼리로 된 KEY가 있는지 찾고 결과를 반환하는 굉장히 단순한 방식이기 때문에 쿼리의 대, 소문자 및 공백에도 반응한다. 그러므로 비슷한 작업을 하는 쿼리는 하나의 쿼리로 통일해 문자열을 관리해주는 것이 좋다. 2. 해당 ..

article thumbnail
친절한 SQL 튜닝 05
Review 2021. 5. 8. 21:42

조인 전략 NL 조인(Nested Loop) - 가장 기본이 되는 전략 - 조인 대상이 되는 두 테이블의 인덱스를 이용한다. - Outer Table, Inner Table로 나눠서 작업한다. - 사원 테이블과 고객 테이블이 있다고 가정하자. - 고객 테이블에는 해당 고객을 담당하는 사원의 ID가 column으로 있다. - 이 두 테이블을 JOIN 할 때 양쪽 테이블 모두 인덱스를 사용한다. - Outer Table 쪽은 테이블 사이즈에 따라서 사용하지 않을 수도 있다.(Full Scan이 빠른 경우) - 하지만 Inner Table 쪽은 반드시 인덱스를 사용해야 한다. 그렇지 않으면 For Loop처럼 Inner Table Full Scan * Outer Table에서 읽은 횟수만큼 Full Scan이..

article thumbnail
웹 엔지니어가 알아야 할 인프라의 기본 01
Review 2021. 5. 8. 19:07

RAID 시스템은 가능하면 하드웨어로 구현할 것 - 0 : Striping, 데이터 분산, 읽기 속도 증가, 데이터 손상 시 복구 불가 - 1 : Mirroring, 데이터 복사, 읽기 및 쓰기 속도 그대로, 데이터 손상 시 복구 가능 - 4 : RAID 1 + 데이터 손상을 복구할 수 있는 Parity용 HDD 추가, Parity HDD 병목현상으로 잘 안 씀 - 5 : RAID 4 + Parity 데이터 Striping, HDD 한 개가 손상되어도 나머지로 복구 가능 - 6 : RAID 5 + Parity 데이터를 하나 더 만들어서 Striping, HDD 두 개가 손상되어도 나머지로 복구 가능 Buffer - 처리를 효율화하고 보틀넥을 완화하기 위한 기술 - 일반적으로 다음 단계의 처리 효율을 올리..

article thumbnail
SQL 레벨업 03
Review 2021. 5. 2. 21:33

서브 쿼리의 문제점 - 연산 비용 추가 - 즉 select 구문을 또 수행하는 것이기 때문에 서브 쿼리마다 select 구문을 실행해서 데이터를 만들어야 한다. - 데이터 I/O 비용 발생 - 서브 쿼리는 일반 쿼리와 다르게 명시적인 제약 또는 인덱스가 작성된 테이블과 다르게 그러한 메타 정보가 전혀 없다. - 따라서 옵티마이저가 쿼리를 해석하기 위해 필요한 정보를 서브 쿼리에선 얻을 수 없다. - 이에 대한 대책으로 VIEW 병합(서브 쿼리 내부 로직가 외부 로직을 결합해서 하나의 실행 계획을 만드는 것)이라는 기법이 있긴 하다. 서브 쿼리를 사용해서 더 효율적인 상황도 있다 - 서브 쿼리와 결합을 윈도 함수로 대체하면 성능을 개선할 가능성이 있다. - 결합 작업을 할 때 옵티마이저가 결합 대상 레코드..

article thumbnail
SQL 레벨업 02
Review 2021. 5. 2. 21:10

UNION은 대부분의 상황에서 비효율적인 쿼리일 가능성이 높다. CASE로 분기하자. - 외부적으로는 하나의 SQL 구문을 실행하는 것처럼 보이지만 - 내부적으로는 여러 개의 select 구문을 실행하는 실행 계획으로 해석된다. - 즉 테이블에 접근하는 횟수가 많아져 I/O 비용이 늘어난다. - (SQL UNION SQL) 이렇게 있으면 SQL 각각 select 연산을 수행한다. - select 구문으로 분기하지 않고 CASE 구문으로 분기하는 접근만으로도 SQL 효율을 올릴 수 있다. 결합 알고리즘 - JOIN 연산을 수행할 때 옵티마이저가 선택하는 알고리즘 - Nested Loops - Hash - Sort Merge의 크게 3가지가 있다. - 참고로 MySQL은 Nested Loops만을 공식적으로..