일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 서브타입
- 배타서브타입
- order-by
- Workbench
- 완전서브타입
- index
- 실행계획
- 크롬원격데스크톱
- 불완전서브타입
- 제1정규형
- 샘플데이터
- SQL
- 제3정규형
- 중복서브타입
- 정규형
- 요구사항명세서
- 물리모델
- 워크벤치
- 제2정규형
- 제4정규형
- 공통코드
- mysql
- vue3
- 함수종속
- bc정규형
- 인덱스
- group-by
- 데이터통합
- 더미데이터
- 제5정규형
- Today
- Total
domsam - IT 기술 블로그
4장 악성 SQL 튜닝으로 초보자 탈출하기 - (1) 본문
1. AUTO COMMIT
MySQL은 디폴트로 AUTO COMMIT이 활성화 되어 있기 때문에 INSERT, UPDATE, DELETE 작업 후에는 되돌릴 수가 없습니다. 그래서 작업 전에 백업을 하거나 AUTO COMMIT을 비활성화하여 결과를 보고 적용하거나 원 상태로 되돌리기 할 수 있습니다.
-- AUTO COMMIT 확인 (1: 활성화, 0: 비활성화)
SELECT @@autocommit;
-- AUTO COMMIT 활성화
SET autocommit = 1;
-- AUTO COMMIT 비활성화
SET autocommit = 0;
-- 결과 적용
COMMIT;
-- 되돌리기
ROLLBACK;
2. 예제 맞도록 employee 데이터베이스 세팅
아래 예제는 "업무에 바로 쓰는 SQL 튜닝 - 양바른 지음, 한빛미디어" 책에 소개되는 예제입니다. 책에서 제공해주는 tuning 데이터베이스는 employees 데이터베이스를 개량하였습니다. tunning 데이터베이스는 테이블명, 컬럼명이 한글로 되어 있어 쿼리문을 작성할 때 한/영을 자주 변경해야 되어 불편합니다. 그래서 employees 데이터 베이스를 tuning 데이터베이스와 같도록 변경하여 사용하도록 하겠습니다. tuning 데이터베이스에 존재하는 값도 필요하기 때문에 tuning 데이터베이스를 설치해야 합니다.
2.1 departments
tuning 데이터베이스의 `부서` 테이블에는 `비고` 컬럼이 존재합니다. departments 테이블에 `note` 컬럼을 추가하고 레코드 별로 같은 값을 가질 수 있게 처리합니다.
-- 부서 테이블에 note 컬럼 추가
ALTER TABLE departments
ADD COLUMN note VARCHAR(40) NULL;
-- 각 컬럼의 값을 tunning 데이터베이스 `부서` 테이블의 `비고` 컬럼과 같게 변경
UPDATE departments A
JOIN tuning.`부서` B
ON A.dept_no = B.`부서번호`
SET A.note = B.`비고`;
2.2 salaries
tuning 데이터베이스의 `급여` 테이블에는 `사용여부` 컬럼이 존재합니다. salaries 테이블에 `yn_use` 컬럼을 추가하고 레코드 별로 같은 값을 가질 수 있게 처리합니다. 그리고 인덱스도 추가합니다.
ALTER TABLE salaries
ADD COLUMN yn_use VARCHAR(1) NOT NULL DEFAULT '0';
ALTER TABLE salaries
ADD INDEX idx_ynuse(yn_use);
UPDATE salaries
SET yn_use = '1'
WHERE to_date = '9999-01-01';
2.3 employees_commute
tuning 데이터베이스에는 `사원출입기록` 테이블이 존재하지만 employees 데이터베이스에는 존재하지 않습니다. `사원출입기록` 테이블과 매핑되는 `employees_commute` 테이블을 생성하고 데이터를 삽입한다.
CREATE TABLE employees_commute (
commute_id INT(10) NOT NULL AUTO_INCREMENT,
emp_no INT(10) NOT NULL,
commute_time TIMtuningESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
commute_type CHAR(1) NOT NULL COLLATE 'utf8mb3_general_ci',
door CHAR(1) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
location CHAR(1) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
PRIMARY KEY (commute_id, emp_no) USING BTREE,
INDEX idx_location (location) USING BTREE,
INDEX idx_commute_time (commute_time) USING BTREE,
INDEX idx_door (door) USING BTREE
);
INSERT INTO employees_commute
(commute_id, emp_no, commute_time, commute_type, door, location)
SELECT A.순번, A.사원번호, A.입출입시간
, A.입출입구분, A.출입문, A.지역
FROM tuning.`사원출입기록` A;
2.4 employees
tuning 데이터베이스의 `사원` 테이블에는 PK, `입사일자`, '성별, 성` 인덱스가 존재한다. employees 테이블에는 PK, `hire_date`, `gender, birth_date`, `first_name` 인덱스가 있다. employees 테이블의 인덱스를 삭제하거나 변경하여 tuning 데이터베이스의 `사원` 테이블과 같은 인덱스를 가질 수 있도록 수정한다.
-- 기존 gender, birth_date 인덱스 삭제
ALTER TABLE employees
DROP INDEX ix_gender_birthdate;
-- 기존 first_name 인덱스 삭제
ALTER TABLE employees
DROP INDEX ix_firstname
-- gender, last_name 인덱스 생성
ALTER TABLE employees
ADD INDEX idx_gender_lastname(gender, last_name);
-- first_name 콜레이트 변경
ALTER TABLE employees
CHANGE COLUMN first_name first_name VARCHAR(14) NOT NULL
COLLATE 'UTF8MB4_bin';
'SQL > SQL 튜닝' 카테고리의 다른 글
4장 악성 SQL 튜닝으로 초보자 탈출하기 - (2) (0) | 2025.03.25 |
---|---|
3장 SQL 튜닝의 실행 계획 파헤치기 - (2) (0) | 2025.03.17 |
3장 SQL 튜닝의 실행 계획 파헤치기 - (1) (0) | 2025.03.14 |
2장 SQL 튜닝 용어를 직관적으로 이해하기 (작성중) (0) | 2025.03.14 |