본문 바로가기

전체보기123

[SQL 튜닝] 인덱스를 하나만 사용하는 나쁜 SQL 문 인덱스를 하나만 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 이름이 Matt이거나 입사일자가 1987년 3월 31일인 사원정보를 조회하는 쿼리 EXPLAIN SELECT * FROM 사원 WHERE 이름 = 'Matt' OR 입사일자 = '1987-03-31'; - SQL문 결과 : 총 343건의 결과 출력, 102ms 소요 (소요 시간이 매우 짧음) - 튜닝 여부를 판단할 때 짧은 소요시간만을 기준으로 삼지 않음 → 더 나은 쿼리로 변경할 수 있음 - 사원 테이블 : 테이블 풀스캔(type항목 : ALL)로 처리 - 스토리지 엔진으로 모든 데이터를 가져온 뒤 MYSQL 엔진에서 2개의 조건절을 활용하여 데이터를 필터링 튜닝 수행 - 우선, 조건절에 해당하는 데이터 분포 확인 /* 30.. 2023. 8. 2.
[SQL 튜닝] 인덱스 없이 작은 규모의 데이터를 조회하는 나쁜 SQL 문 인덱스 없이 작은 규모의 데이터를 조회하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 이름이 Georgi이고, 성이 Wielonsky인 사원 정보를 출력하는 쿼리 EXPLAIN SELECT * FROM 사원 WHERE 이름 = 'Georgi' AND 성 = 'Wielonsky'; - SQL문 결과 : 총 1건의 결과 출력, 85.8ms 소요 - 사원 테이블 : 테이블 풀 스캔(type항목 : ALL) - 스토리지 엔진에서 가져온 전체 데이터 중 WHERE 이름 = 'Georgi' AND 성 = 'Wielonsky' 조건절로 필요한 데이터 추출(Extra 항목: Using where)하여 출력 튜닝 수행 - 최종적으로 1건의 데이터를 가져오고자 테이블을 처음부터 끝까지 풀 스캔하는 방식은 비효.. 2023. 7. 30.
[SQL 튜닝] 대량의 데이터를 가져와 조인하는 나쁜 SQL 문 대량의 데이터를 가져와 조인하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 부서관리자 테이블과 부서사원_매핑 테이블을 부서번호 열로 조인하고 중복을 제거한 부서번호를 출력하는 쿼리 즉, 부서의 관리자가 소속된 부서번호를 조회하면서 부서사원_매핑 테이블에도 있는 부서번호를 선택 EXPLAIN SELECT DISTINCT 매핑.부서번호 FROM 부서관리자 관리자, 부서사원_매핑 매핑 WHERE 관리자.부서번호 = 매핑.부서번호 ORDER BY 매핑.부서번호; - SQL문 결과 : 총 9건의 결과 출력, 382ms 소요 - 부서번호 정보에서 중복이 제거되고 오름차순으로 정렬된 9건의 데이터 출력 - id가 1인 부서사원_매핑 테이블과 부서관리자 테이블의 2개 행 출력 - 드라이빙 테이블 : 부서사원.. 2023. 7. 29.
[SQL 튜닝] 필요 이상으로 많은 정보를 가져오는 나쁜 SQL 문 필요 이상으로 많은 정보를 가져오는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블에서 성별이 M(남)이고, 사원번호가 300,000을 초과하는 사원 대상으로 부서관리자 테이블과 외부 조인을 수행한 뒤, 해당하는 사원번호의 개수를 출력하는 쿼리 SELECT COUNT(사원번호) AS 카운트 FROM ( SELECT 사원.사원번호, 부서관리자.부서번호 FROM (SELECT * FROM 사원 WHERE 성별 ='M' AND 사원번호 > 300000 ) 사원 LEFT JOIN 부서관리자 ON 사원.사원번호 = 부서관리자.사원번호 ) 서브쿼리 /* 실행계획 */ EXPLAIN SELECT COUNT(사원번호) AS 카운트 FROM ( SELECT 사원.사원번호, 관리자.부서번호 FROM (S.. 2023. 7. 28.
[SQL 튜닝] 비효율적인 페이징을 수행하는 나쁜 SQL 문 비효율적인 페이징을 수행하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블과 급여 테이블의 내부 조인을 수행하는 쿼리 사원번호가 10,0001 ~ 50,000번에 사이에 해당하는 데이터들을 사원번호 기준으로 그루핑한 뒤 연봉 합계 기준으로 내림차순 정렬 (150번째 데이터부터 10건의 데이터만 제한) EXPLAIN SELECT 사원.사원번호, 사원.이름, 사원.성, 사원.입사일자 FROM 사원, 급여 WHERE 사원.사원번호 = 급여.사원번호 AND 사원.사원번호 BETWEEN 10001 AND 500000 GROUP BY 사원.사원번호 ORDER BY SUM(급여.연봉) DESC LIMIT 150,10; - SQL문 결과 : 총 10건의 결과 출력, 1.59s 소요 - 드라이빙 테이.. 2023. 7. 27.
[SQL 튜닝] 처음부터 모든 데이터를 가져오는 나쁜 SQL 문 처음부터 모든 데이터를 가져오는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원번호가 10,0001번부터 10,100번까지인 사원들의 평균연봉과 최고연봉, 최저연봉을 구하는 쿼리FROM 절의 급여 테이블에 사원별 평균/최고/최저 연봉을 조회하는 인라인 뷰가 있고, 사원 테이블의 사원번호 열과 내부 조인하여 최종 통계 결과 출력 EXPLAIN SELECT 사원.사원번호, 급여.평균연봉, 급여.최고연봉, 급여.최저연봉 FROM 사원, (SELECT 사원번호, ROUND(AVG(연봉),0) 평균연봉, ROUND(MAX(연봉),0) 최고연봉, ROUND(MIN(연봉),0) 최저연봉 FROM 급여 GROUP BY 사원번호 ) 급여 WHERE 사원.사원번호 = 급여.사원번호 AND 사원.사원번호 BETW.. 2023. 7. 24.