스터디/업무에 바로 쓰이는 SQL 튜닝

❌ 문제의 SQL문select distinct 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호from 사원join 부서관리자 on (사원.사원번호 = 부서관리자.사원번호);  📉 이게 왜 문제일까? 실행계획을 살펴보자.- id가 모두 1인것으로 보아 join한 관계이다.- 부서관리자 type : index -> 풀스캔- 사원 테이블 type : eq_ref -> 사원 테이블의 기본키(사원번호)를 사용- Extra : Using temporary -> distct를 위한 별도의 임시테이블 사용+----+-------------+-----------------+------------+--------+---------------+----------------+---------+-----------..
❌ 문제의 SQL문SELECT * FROM 사원WHERE CONCAT(성별, ' ', 성) = 'M Radwan'; 📉 이게 왜 문제일까? 실행계획을 살펴보자.type -> 테이블 풀스캔약 30만개를 스캔하였고, 실제 데이터는 102개를 가져왔다.+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------..
❌ 문제의 SQL문아래는 사용 여부가 1인 급여 개수를 구하는 쿼리이다.약 42000개가 탐색됨.select count(1)from 급여where 사용여부 = 1; 금여 테이블과 인덱스는 아래와 같이 설정되어 있다.인덱스사원번호 + 시작일자 PK사용여부  📉 이게 왜 문제일까? 실행계획을 살펴보자.key : 사용여부 항목을 인덱스로 사용함.type : index → 인덱스 풀 스캔rows : 283만사실상 모든 인덱스 테이블 행을 탐색했음.filterd : 10 → 엔진으로부터 가져온 데이터 중 10%를 추출해서 최종 데이터를 출력할 예정.+----+-------------+--------+------------+-------+----------------+----------------+--------..
❌ 문제의 SQL문SELECT IFNULL(성별, 'NO DATA') AS 성별, COUNT(1) 건수FROM 사원GROUP BY IFNULL(성별, 'NO DATA');  📉 이게 왜 문제일까? 실행계획을 살펴보자.type : 인덱스 풀스캔Extra : Using temporary -> 임시테이블 만들어서 사용IFNULL() 처리를 위해 임시테이블을 만들었다.+----+-------------+--------+------------+-------+---------------+--------------+---------+------+--------+----------+------------------------------+| id | select_type | table | partitions | ty..
4장에는 실제 잘못된 SQL문과 개선된 SQL문을 보여주며 소개해주고 있다.팀원과 한 파트씩 나눠가면서 발표하며 스터디를 진행하로 했고, 오늘은 첫번째 사례이다. ❌ 문제의 SQL 문사원 테이블/ 현재 걸린 인덱스 참고하려면 아래 더보기 클릭더보기+--------------+--------------+-----------+----------+--------+--------------+| 사원번호 | 생년월일 | 이름 | 성 | 성별 | 입사일자 |+--------------+--------------+-----------+----------+--------+--------------+| 10001 | 1953-09-02 | Ge..
실습 데이터 세팅교재에 나와있는 github 링크에서 sql 파일을 다운받았다. 실습을 위해 도커로 MySQL 8.4버전 컨테이너로 띄움명령어 : docker run --name mysql-study -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306docker 환경에 mysql 8.4버전 실행중이고, 받은 파일을 아래 명령어를 통해 docker 컨테니어 내부로 복사해줬다.명령어 : docker cp [다운받은 복사할 폴더] [컨테이너id]:/init-db 그럼 아래처럼 docker 컨테이너 접속하고 cd init-db 후 ls해보면 실습 sql파일이 복사되었다.mysql -u root -p (아래는 미리생성해준 mysql_study DB에 넣어보려고 했는데, sql이 ..
MySQL을 기준으로 스터디 합니다.물리엔진 용어MySQL 구성요소MySQL 엔진SQL문을 토대로 문법검사등을 수행하고, SQL을 최소 단위로 분리한다.데이터를 빠르게 찾을 수 있는 경로를 탐색한다.(최적화 경로 탐색)스토리지 엔진으로 부터 받은 데이터를 가공 및 연산(필터링 join 등) 한다.스토리지 엔진(ex InnoDB)요청받은 SQL문을 토대로 디스크나 메모리에서 필요한 데이터를 가져오고, MySQL 엔진으로 보내줌스토리지 엔진에 따라 쓰기효과, 빠르게 읽는 효과 등 다를 수 있으므로 적절한 스토리지 엔진을 선택해야함.  이 책은 MySQL 8.0  버전의 InnoDB 엔진 기준으로 설명하고 있다. 파서(parsor) : 사용자가 요청한 SQL문을 쪼개 최소 단위로 분리하고 트리를 만든다.(문법..
Don't stop 훈
'스터디/업무에 바로 쓰이는 SQL 튜닝' 카테고리의 글 목록