프로그래머스 백엔드 데브코스 12일차
백둥타임
- RBF(Random Bit Flip) 진행합시다~
- 코어타임 고정은 14~18h, 팀별 조정 2h 추가
- 피어리뷰!
MYSQL(DB)
트랜잭션?
- Atomic하게 실행해야 하는 SQL들을 하나의 작업처럼 처리하는 방법이다.
Atomic?
- DB의 특성 중 Atomicity(원자성)란 것이 있다. Atomic하단 것은 원자성을 지켰단 뜻이다.
- 항공 티켓 주문이 원자성의 예시 중 하나로 티켓은 지불과 예약이 동시에 되거나 아니면 모두 되지 않아야 한다.
- 즉 모두 실행되거나 모두 실행되지 않아야 한다.
트랜잭션은
- 위와 같은 특성 때문에 SELECT에는 사용할 필요가 없다. ( SELECT는 원자성을 지킬 필요가 없다. )
- BEGIN과 END 또는 COMMIT 사이있는 SQL들을 사용한다.
- ROLLBACK 할 수 있다!
BEGIN;
티켓 지불;
티켓 예약;
END; -- COMMIT은 END랑 동일함
ROLLBACK; -- BEGIN이전으로 돌아감.
autocommit이란
- 기본값은 True로 모든 레코드 수정/삭제/추가 작업이 기본적으로 DB에 바로 쓰여진다.
- true는 BEGIN, END(COMMIT) 사용함.
- False라면 모든 작업을 COMMIT만 사용하며 명시적으로 호출 해야함.
- 두 작업 모두 ROLLBACK이 가능.
Stored Procedure란
- MySQL 서버단에 저장되는 SQL 쿼리들을 뜻한다.
- 리턴 값은 레코들의 집합으로 SELECT와 동일하다.
- 다만, 디버깅이 힘들고 서버단의 부하를 증가시킨다.
-- 삭제
DROP PROCEDURE IF EXISTS procedure_name
-- 정의
DELIMITER //
CREATE PROCEDURE procedure_name(parameter_list)
BEGIN
statements;
END //
DELIMITER;
-- 호출
CALL stored_procedure_name(argument_list);
-- IN
CREATE PROCEDURE procedure_name(IN searchName varchar(64))
BEGIN
SELECT *
FROM table_name
WHERE name = searchName
-- INOUT
CREATE PROCEDURE procedure_name(IN searchName varchar(64), INOUT totalCount int)
BEGIN
SELECT COUNT(1) INTO totalCount
FROM table_name
WHERE name = searchName
-- INOUT 호출 후 출력
SET @name_count=0
CALL procedure_name('name',@name_count);
SELECT @name_count;
Stored Function이란
- 값(Scalar)을 하나 리턴해주는 서버단 함수
- 모든 함수의 Argument는 IN 파라미터다
- Stored Procedure과는 다르게 SQL 안에서 사용 가능하다.
-- 정의
DELIMITER $$
CREATE FUNCTION db.Name_Type(name varchar(64))
RETURNS VARCHAR(20)
DTERMINISTIC
BEGIN
DECLARE name_type VARCHAR(20)
IF name in ('A','B','C') THEN
SET name_type = 'typeA';
ELSEIF name in ('D','E','F') THEN
SET name_type = 'typeB';
ELSE
SET name_type = name;
END IF;
RETURN (name_type);
END$$
-- 호출
SELECT name, db.Name_Type(name)
FROM db.name;
Trigger란
- INSERT나 DELETE나 UPDATE 전 후에 등록한 작업을 수행한다.
- NEW나 OLD란 modifier를 사용 할 수 있다.
- NEW나 OLD나 둘 다 UPDATE를 사용할 수 있지만 NEW는 INSERT를, OLDE는 DELETE를 사용 할 수 있다.
- 중요 테이블의 변경이 생길 때 audit(감사) 용도로 사용할 수 있다. (변경전 레코드를 저장하는 트리거를 등록하는 등)
CREATE TRIGGER triger_name
{BEFORE|AFTER} {INSERT|UPDATE|DELETE}
ON table_name FOR EACH ROW
triger_body;
Explain SQL
- 쿼리가 어떻게 수행되는지 내부를 보여주는 명령어
- Execution Plan을 보여준다
-- 예시
EXPLAIN SELECT ...
FROM ...
JOIN ...
GROUP BY ...
ORDER BY ...;
Index로 성능 튜닝
- INDEX와 KEY는 동의어다.
- SELECT, DELETE, JOIN 명령을 빠르게 수행할 수 있지만 INSERT, UPDATE을 느리게 한다.
-- 생성시 인덱스 지정
CREATE TABLE table_name(
id INT NOT NULL AUTO_INCREMENT,
...
INDEX index_name (col_name)
)
-- 생성 후 인덱스 지정
ALTER TABLE table_name ADD INDEX(col_name);
ALTER TABLE table_name ADD UNIQUE(col_name);
ALTER TABLE table_name ADD FULLTEXT(col_name);
ALTER TABLE table_name DROP INDEX(col_name);
CREATE UNIQUE INDEX index_name ON table_name(col_name1, col_name2, ...);
RDB는요
- 용량증대에 한계가 있다. 그런만큼 서비스 운영에 필요한 데이터만 저장해야한다.
참고
https://ko.wikipedia.org/wiki/원자성_(데이터베이스_시스템)