약 2달간 책 너무 두껍다 1기를 진행하면서 Realy MySQL 8.0 1권을 1회독했다. 일주일 중, 일요일을 제외한 6일을 매일 약 10page 를 읽고 요약, 메모를 진행하는 독서 프로그램이다. (이틀 연속 독서 내용을 정리하지 못하면 탈락하게 된다..) 시중에 정말 좋은 개발 관련 책들이 많이 있지만, 사기만 하고 읽지를 못했었다.. 마침 23년 한해를 시작하면서 함께 개발 공부했던 동기가 책너두라는 프로그램을 기획했고 이번 기회에 쌓아뒀던 책을 하나씩 읽는 습관을 들이고 싶어서 책너두 1기를 시작했다. 책너두에서 모집하는 책이 여러권 있었는데, 내가 관심있는 개발 관련 책은 Real MySQL 8.0 과 데이터 중심 어플리케이션 설계 라는 책이었는데, 마침, 실무에서 드라이빙 테이블, 드리븐 ..
요약 Extra 칼럼의 나머지 값들을 이해하게 됨. Using MRR 최소 페이지 접근하여 레코드를 읽을 수 있게 최적화함. Using sort_union(…), Using union(…), Using intersect(…) 인덱스 조건이 AND, OR 일때에 따라 최적화 하는 기법임. Using temporary 내부 임시 테이블을 이용하는 실행 계획임. 메모리, 혹은 디스크 중 어디세 저장됐는지는 시스템 변수로 확인 가능 Using where 스토리지, MySQL 엔진에서 작업 범위 조건 & 체크 조건에 따라 쿼리 처리가 각각 나눠져서 실행됨. Zero limit 실행 레코드 데이터 값이 아닌 쿼리 결과값의 메타 데이터만을 반환함. 메모 Using MRR MySQL 엔진은 실행 계획을 수립하고 그 실..
요약 Extra 칼럼의 나머지 값들을 이해하게 됨. Using index condition 인덱스 컨디션 푸시다운 최적화 Using index for group-by 그루핑에 따른 인덱스 처리 최적화 방식 타이트 인덱스 스캔(인덱스 스캔)을 통한 GROUP BY 처리 루스 인덱스 스캔을 통한 GROUP BY 처리 Using index for skip scan 루스 인덱스 스캔 최적화를 확장한 버전 Using join buffer(Block Nested Loop), Using join buffer(Batched Key Access), Using join buffer(hash join) 드리븐 테이블에 적절한 인덱스 칼럼이 있는게 좋음. 드리븐, 드라이브 테이블을 결정하며 필요에 따라 조인 버퍼를 할당함. ..
요약 Extra 칼럼의 나머지 값들을 이해하게 됨. Start temporary, End temporary 중복 제거를 위한 내부 임시 테이블 사용 unique row not found 유니크 칼럼 아우터 조인 시, 아우터 테이블에 일치하는 레코드가 존재하지 않을 때 Using filesort ORDER BY가 인덱스를 사용하지 못할 때 Using index(커버링 인덱스) 데이터 파일을 읽지않고 인덱스만으로 쿼리를 모두 처리할 수 있을 때 메모 Start temporary, End temporary 세미 조인 최적화 중, Duplicate Weed-out 최적화 전략이 사용되면, MySQL 옵티마이저는 실행 계획의 Extra 칼럼에 “Start temporary”와 “End temporary” 문구를 ..
요약 Extra 칼럼의 나머지 값들을 이해하게 됨. Plan isn’t ready yet 실행 중인 쿼리의 실행 계획을 살펴볼 때, 실행 계획이 수립하지 못한 상태임. Range checked for each record(index map: N) 인덱스 맵을 통해, 인덱스 레인지 스캔이 가능한지 레코드 단위로 체크함. Recursive WITH CTE 를 통해 재귀 쿼리를 사용할 수 있음. Rematerialize 래터럴 조인을 통해 임시 테이블을 매번 생성하여 저장함. Select tables optimized away 집계 함수 최적화가 가능한 경우임. 메모 Plan isn’t ready yet MySQL 8.0 버전에서는 다른 커넥션에서 실행 중인 쿼리의 실행 계획을 살펴볼 수 있음. SHOW PR..
요약 Extra 칼럼의 나머지 값들을 이해하게 됨. FirstMatch Full scan on NULL key Impossible HAVING Impossible WHERE LooseScan No matching min/max row no matching row in const table No matching rows after partition pruning No tables used Not exists 각 칼럼이 어느 상황에서 출력되는지 이해하게 됨. 메모 FirstMatch 세미 조인의 여러 최적화 중, FirstMatch 전략이 사용되면 MySQL 옵티마이저는 실행 계획의 Extra 칼럼에 “FirstMatch(table_name)” 메시지를 출력함. 9.3.1.11절 퍼스트 매치를 참조하자. F..
요약 key_len 칼럼에서 표시하는 값의 의미를 알게 됨. 인덱스를 사용하는 칼럼의 데이터 타입이 가질 수 있는 바이트임 ref 칼럼에 표시되는 값의 의미를 알게 됨. 상수 값인지, 외부 테이블의 어떤 칼럼인지, 산술 표현이 사용된 func 타입인지 알 수 있음. rows 칼럼의 값의 의미를 알게 됨. 실행 계획을 위해 예측한 레코드 건수를 알려줌 filtered 칼럼의 값의 의미를 알게 됨. 인덱스 뿐만아니라 모든 조건에서의 일치하는 레코드 건수를 알 수 있는 값임. 필터링 되고 남은 값의 %를 보여줌. Extra 칼럼에 표시되는 값들을 알게 됨. const row not found Deleting all rows Distinct 메모 key_len 칼럼 실제 업무에서 사용하는 테이블은 단일 칼럼으로..
요약 type 칼럼의 종류중 아래의 내용에 해당 하는 값을 이해하게 됨 ref_or_null, unique_subquery, index_subquery, range, index_merge, index, ALL 인덱스 레인지 스캔 = const, ref, range 실행 계획의 possible_keys 칼럼의 의미를 이해하게 됨. 사용될 뻔했던 키 값들이 표시됨 실행 계획의 key 칼럼의 의미를 이해하게 됨. 실제로 사용된 key 값들이 나열됨. 메모 ref_or_null ref 접근 방법과 같은데, NULL 비교(IS NULL)가 추가된 형태임. 실무에서 많이 활용되지는 않지만 만약 사용한다면 나쁘지 않은 접근 방법임. unique_subquery WHERE 조건절에서 사용될 수 있는 IN(subquer..
요약 type 칼럼의 종류와 각 종류의 실행 계획 계산 방법을 이해하게 됨. const, eq_ref, ref 는 where 절의 비교 연산자로 동등 비교 연산자여야 함. 이 3가지 접근 방법은 매우 좋은 접근 방법임. 또, ref, fulltext 에 대한 실행 계획 선정 방법을 이해하게 됨. 메모 type 칼럼 MySQL 실행 계획에서 type 이후 칼럼은 MySQL 서버가 각 테이블의 레코드를 어떤 방식으로 읽었는지를 나타냄. 일반적으로 쿼리 튜닝할 때 인덱스를 효율적으로 사용하는지 확인하는 것이 중요함. 그래서 type 칼럼을 반드시 체크하는것이 중요하다. 실행 계획의 type 칼럼에 표시될 수 있는 값은 아래와 같음. system const eq_ref ref fulltext ref_or_nul..
요약 table 칼럼에 표시되는 값들의 의미를 이해하게 됨. partitions 칼럼에 표시되는 값이 무슨 의미인지 이해하게 됨. 메모 table 칼럼 MySQL 서버 실행 계획은 단위 SELECT 쿼리 기준이 아니라 테이블을 기준으로 표시됨. 테이블 이름에 별칭이 부여된 경우, 별칭이 표시됨. 별도의 테이블을 사용하지 않는 SELECT 쿼리인 경우, table 칼럼에 NULL 이 표시됨. 또는 과 같이 “”로 둘러싸인 이름이 명시되는 경우가 많은데, 이 테이블은 임시 테이블을 의미함. “”안에 항상 표시되는 숫자는 단위 SELECT 쿼리의 id 값을 지칭함. select_type이 MATERIALIZED인 실행 계획에서는 “”과 같은 값이 table 칼럼에 표시됨. 이는 서브쿼리의 결과를 구체화(Mat..
요약 실행 계획의 select_type 칼럼에 표시되는 내용들에 대해 이해하게 됨. SIMPLE PRIMARY UNION DEPENDENT UNION UNION RESULT SUBQUERY DEPENDENT SUBQUERY DERIVED DEPENDENT DERIVED UNCACHEABLE SUBQUERY UNCACHEABLE UNION MATERIALIZED 메모 select_type 칼럼 각 단위 SELECT 쿼리가 어떤 타입의 쿼리인지 표시되는 칼럼임. select_type 칼럼에 표시되는 값을 살펴보자. SIMPLE UNION, 서브쿼리를 사용하지 않는 단순한 SELECT 쿼리인 경우임. (쿼리에 조인이 포함된 경우도 마찬가지임) 쿼리 문장이 아무리 복잡하더라도 실행 계획에서 select_type..
요약 실행 계획을 확인하는 방법을 알게 됨. DESC, EXPLAIN 명령으로 확인 가능 8.0부터 옵션이 추가됨. (출력 포맷, 실제 쿼리 실행 결과 확인 가능) 실행 계획 출력 포맷 JSON, TREE, 단순 테이블 쿼리 실행 시간을 확인할 수 있음. EXPLAIN ANALYZE 명령 이용 loops 값이 1 이상이면 각 필드 값에 나타나는 값들은 평균 값임. 실행 계획 분석을 위한 각 칼럼을 이해해야 함. id 칼럼은 단위 쿼리를 기준으로 접근 순서를 표현함 테이블의 접근 순서를 말하는 것은 아님 메모 실행 계획 확인 MySQL 서버의 실행 계획은 DESC 또는 EXPLAIN 명령으로 확인할 수 있음. 8.0 버전부터는 EXPLAIN 명령에 사용할 수 있는 새로운 옵션이 추가됨. 실행 계획의 출력 ..