2022-04-01 TIL

이창호·2022년 4월 1일
0

프로그래머스 백엔드 데브코스 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/원자성_(데이터베이스_시스템)

profile
이타적인 기회주의자

0개의 댓글