본문 바로가기

SQL 튜닝/SQL 문 단순 수정10

[SQL 튜닝] 범위 조건으로 인덱스를 사용하는 나쁜 SQL 문 범위 조건으로 인덱스를 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 입사일자가 1994년 1월 1일부터 2000년 12월 31일까지인 사원들의 이름과 성을 출력하는 쿼리 EXPLAIN SELECT 이름, 성 FROM 사원 WHERE 입사일자 BETWEEN STR_TO_DATE('1994-01-01', '%Y-%m-%d') AND STR_TO_DATE('2000-12-31', '%Y-%m-%d'); - SQL문 결과 : 총 48,875건의 결과 출력, 116 ms 소요 튜닝 수행 SELECT COUNT(1) FROM 사원; - 사원 테이블 : 총 데이터 300,024건 (튜닝 전 SQL 문의 결과 건수 48,875 건 - 약 17%) - 인덱스를 사용하는 것이 효율적일지, 아니면 인덱스 .. 2023. 7. 18.
[SQL 튜닝] 동등 조건으로 인덱스를 사용하는 나쁜 SQL 문 동등 조건으로 인덱스를 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | B 출입문으로 출입한 이력이 있는 정보를 모두 조회하는 쿼리 EXPLAIN SELECT * FROM 사원출입기록 WHERE 출입문 = 'B'; - 사원출입기록 테이블 : 660000 (약 66만) - SQL문 결과 : 총 300000건의 결과 출력(30만), 0.35 sec 소요 - I_출입문 인덱스를 사용하여 데이터 접근 → 출입문 B에 대한 명확한 상수화 조건으로 인해 ref 항목이 const로 출력 튜닝 수행 SELECT 출입문, COUNT(1) FROM 사원출입기록 GROUP BY 출입문; - 출입문 B는 총 66만 건의 전체 데이터 중 30만 건 - 인덱스에 접근한 뒤 테이블에 랜덤 액세스하는 방식 → 전체 데.. 2023. 7. 17.
[SQL 튜닝] 엉뚱한 인덱스를 사용하는 나쁜 SQL 문 엉뚱한 인덱스를 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블에서 입사일자 열의 값이 '1989'로 시작하면서 사원번호가 100000를 초과하는 데이터를 조회하는 쿼리 EXPLAIN SELECT 사원번호 FROM 사원 WHERE 입사일자 LIKE '1989%' AND 사원번호 > 100000; - 사원 테이블 : 300024 (약 30만) - SQL문 결과 : 총 20001건의 결과 출력, 10.4ms 소요 - key 항목 : PRIMARY → 범위 스캔(type 항목 : range) 수행- 스토리지 엔진으로부터 기본 키를 구성하는 사원번호를 조건으로 데이터를 가져온 뒤, MYSQL 엔진에서 남은 필터 조건(입사일자 LIKE '1989%) 으로 추출하여 filtered 항목에.. 2023. 7. 16.
[SQL 튜닝] 인덱스 고려 없이 열을 사용하는 나쁜 SQL 문 인덱스 고려 없이 열을 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 성과 성별 순서로 그루핑하여 몇 건의 데이터가 있는지 구하는 쿼리 EXPLAIN SELECT 성, 성별, COUNT(1) as 카운트 FROM 사원 GROUP BY 성, 성별; - 사원 테이블 : 300024 (약 30만) - SQL문 결과 : 총 3274건의 결과 출력, 536ms 소요 - I_성별_성 인덱스 활용 - extra : Using temporary 생성하여 성과 성별을 그루핑해 카운트 연산 수행 - I_성별_성 인덱스의 구성 열이 GROUP BY 절에 포함 → 테이블 접근 없이 인덱스만 사용하는 커버링 인덱스 (extra : Using index) 튜닝 수행 사원 테이블의 I_성별_성 인덱스를 활용하는데도.. 2023. 7. 15.
[SQL 튜닝] 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | SELECT 문을 UNION 연산자로 합치는 쿼리문 EXPLAIN SELECT 'M' AS 성별, 사원번호 FROM 사원 WHERE 성별 = 'M' AND 성 = 'Baba' UNION SELECT 'F' AS 성별, 사원번호 FROM 사원 WHERE 성별 = 'F' AND 성 = 'Baba'; - SQL문 결과 : 총 226건의 결과 출력, 1.5ms 소요 - 마지막 key가 NULL인 세번째 행에서는 id가 1인 행과 2인행의 결과를 통합하여 중복을 제거하는 작업을 처리 - 메모리에 임시 테이블을 생성(Extra 항목의 Using temporary)하고 그 내부에서 각 결과의 UNION 연산 작업을 수행 -.. 2023. 7. 14.
[SQL 튜닝] 습관적으로 중복을 제거하는 나쁜 SQL 문 습관적으로 중복을 제거하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 부서 관리자의 사원번호와 이름, 성, 부서번호 데이터를 중복 제거하여 조회하는 쿼리 EXPLAIN SELECT DISTINCT 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호 FROM 사원 JOIN 부서관리자 ON (사원.사원번호 = 부서관리자.사원번호); - 부서 관리자 테이블 컬럼 수 : 24 - SQL문 결과 : 총 24건의 결과 출력, 0.4ms 소요 - 드라이빙 테이블인 부서관리자 테이블과 드리븐 테이블인 사원 테이블의 id 값 둘다 1로 동일하게 나타남 → 서로 조인 - 부서관리자 테이블의 type 항목 : index → 인덱스 풀 스캔 방식 수행 - 사원 테이블의 type 항목 : eq_ref → 사원.. 2023. 7. 13.