본문 바로가기

전체보기123

[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.
[SQL 튜닝] 열을 결합하여 사용하는 나쁜 SQL 문 열을 결합하여 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블에서 성별의 값과 1칸의 공백(space), 성의 값을 모두 결합한 결과가 'M Radwan'인 데이터를 조회하는 쿼리 EXPLAIN SELECT * FROM 사원 WHERE CONCAT(성별, ' ',성) ='M Radwan'; - 사원 테이블 컬럼 수 : 300024 (약 30만 건) - SQL문 결과 : 총 102건의 결과 출력, 103ms 소요 - 사원 테이블은 CONCAT(성별,' ',성) = 'M Radwan' 조건절로 데이터에 접근하지만, 테이블 풀 스캔 - type 항목 : ALL → 데이터를 처음부터 끝까지 스캔하므로 비효율적임 튜닝 수행 - 총 300,024건 중에 102건의 데이터를 조회하는 쿼리.. 2023. 7. 12.
[개발생각] REST API URI 설계에 대한 고민(feat. Optional Chaining ?. 연산자) 개발 환경 참고 Frontend : Bootstrap(template), jQuery, ejs(template) Backend : node, express(framework) DB : mysql 개요 상품의 일시품절 상태를 설정하고, 확인날짜(날짜 선택 지정)를 설정하는 기능은 이미 구현되어 있는 상태 상품 상세 페이지에서 일시품절을 걸고, 확인날짜를 선택하고 수정하면 설정일자가 현재시간(NOW())으로 업데이트 된다. 문제점 상품 상세페이지에서 수정을 하면 설정일자가 현재시간(NOW())으로 업데이트가 되는데, form 형식으로 데이터를 보내고 수정하는 방식으로 개발되어 있기 때문에 상품명, 공급가 등 그 외 다른 상품정보를 수정하더라도 설정일자가 현재시간으로 업데이트가 된다. (설정일자가 설정일자가 .. 2023. 7. 12.
[SQL 튜닝] 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 급여 테이블에서 현재 유효한 급여 정보만 조회하고자 사용여부 열의 값이 1인 데이터를 출력하는 쿼리 EXPLAIN SELECT COUNT(1) FROM 급여 WHERE 사용여부 = 1; - 급여 테이블 컬럼 수 : 2844047 (약 284만 건) - SQL문 결과 : 총 1건의 결과 출력, 373ms 소요 COUNT(1) = 42842 - key 항목 : I_사용여부 인덱스 사용 - type 항목 : index → 인덱스 풀스캔 방식으로 수행 - filtered 항목 : 10 → MYSQL 엔진으로 가져온 데이터 중 10% 추출해서 최종 데이터 출력 즉, rows 항목에 표시된 2,838,438건의 데이터를 스토리.. 2023. 7. 11.