카테고리 없음

[모각코] 2주차 결과 (7/15 13:00 ~ 16:00 Zoom 사용)

ddd12347 2022. 7. 15. 15:52

트랜젝션

  • Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법

  • DDL이나 DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음 → SELECT에는 사용할 수 없음

  • 특징

    • 원자성
      • 트랜젝션은 DB에 모두 반영되거나 전혀 반영되지 않아야 한다.
      • 만약 모든 명령이 완벽히 수행되지 않으면 트랜젝션이 모두 다 취소되어야 한다.
    • 일관성
      • 트랜젝션의 작업 처리 결과는 항상 일관성 있어야 한다.
      • 트랜젝션이 진행되는 동안 데이터베이스가 변경되면 처음 트랜젝션을 진행 하기 위해 참조한 데이터베이스에 트랜젝션이 적용됨
    • 독립성
      • 한 트랜젝션이 실행될 때 다른 트랜젝션의 연산에 끼어들 수 없다
    • 지속성
      • 트랜젝션이 성공적으로 완료되었을 경우 결과는 영구적으로 반영된다.
  • 상태

    • Active : 트랜젝션이 실행중인 상태
    • Partial Committed : 트랜젝션의 모든 작업이 끝난 후 commit 되기 전 상태
    • failed : 트랜젝션에 오류가 발생하여 중단된 상태
    • aborted : Rollback 연산을 수행한 상태
  • COMMIT

    • 트랜젝션의 작업들이 성공적으로 끝난 후 확정하여 트랜젝션을 종료하는 명령어
    • 트랜젝션 관리자에게 작업이 끝났음을 알리고 데이터베이스에 반영함
  • ROLLBACK

    • 트랜젝션 작업 중 문제가 발생하여 지금까지의 변경 사항들을 취소하는 명령어
    • 트랜젝션을 시작하기 전 상태로 돌아감
  • 문법

      START TRANSACTION; -- 트랜젝션 시작 명령어(BEGIN 과 동일)
      --sql
      --sql
      COMMIT -- commit 명령(END 와 동일)
      ROLLBACK

View

  • 자주 사용하는 SQL 쿼리를 (SELECT) View로 데이터베이스단에 저장하여 사용하는 것
  • SELECT 결과가 테이블로 저장되는 것이 아닌 View가 사용될때마다 SELECT가 실행됨
  • 가상 테이블이라고도 부름
CREATE OR REPLACE VIEW test.session_details AS
SELECT s.id, s.user_id, s.created, s.channel_id, c.channel
FROM session s
JOIN channel c ON s.channel_id = c.id  
  • 장점
    • 특정 사용자에게 전체가 아닌 필요한 부분만 보여줄 수 있음
    • 복잡한 쿼리를 단순화하고 재사용할 수 있음
  • 단점
    • 한번 정의된 뷰는 변경할 수 없음
    • 삽입, 삭제, 갱신에 제한을 가짐
    • 인덱스를 가질 수 없음

Stored Procedure

  • 데이터베이스 서버단에 저장되는 SQL 쿼리들
    • CREATE PROCEDURE 사용
    • DROP PROCEDURE [IF EXISTS] 로 제거
  • 프로그래밍 언어의 함수처럼 인자를 넘기는 것이 가능
  • 리턴되는 값은 레코드의 집합
  • 간단한 분기문과 루프를 통한 프로그램이 가능
  • 디버깅이 힘들고 서버단의 부하를 증가시킴
DELIMITER // -- 구분자
CREATE PROCEDURE procedure_name(parameter_list)
BEGIN
    statements;
END //
DELIMITER;

CALL stored_procedure_name(argument_list); -- 호출
  • IN parameter : procedure 안으로 전달되는 매개변수

  • INOUT parameter : procedure 안으로 전달되고 연산된 값을 받아 저장하는 매개변수

      DELIMITER //
      CREATE PROCEDURE return_session_count(IN channelName varchar(64), INOUT
      totalRecord int)
      BEGIN
       SELECT COUNT(1) INTO totalRecord FROM test.keeyong_session_details
       WHERE channel = channelName;
      END // -- totalRecord에 COUNT(1)한 값이 저장됨
      DELIMITER ;
      SET @facebook_count = 0 -- 변수선언
      CALL return_session_count('Facebook', @facebook_count);
      SELECT @facebook_count;

Stored Function

  • 값을 하나 리턴해주는 서버쪽 함수
    • 리턴값은 Deterministic 또는 Non Deterministic
  • 모든 함수의 인자는 IN 파라미터
  • SQL 안에서 사용 가능 → Stored Procedure와의 차이점
  • CREATE FUNCTION 사용
DELIMITER $$
CREATE FUNCTION test.Channel_Type(channel varchar(32))
RETURNS VARCHAR(20) -- 리턴타입
DETERMINISTIC
BEGIN
 DECLARE channel_type VARCHAR(20);
 IF channel in ('Facebook', 'Instagram', 'Tiktok') THEN
 SET channel_type = 'Social Network';
 ELSEIF channel in ('Google', 'Naver') THEN
 SET channel_type = 'Search Engine';
 ELSE
 SET channel_type = channel;
 END IF;
-- return the customer level
RETURN (channel_type);
END$$

SELECT channel, test.Channel_Type(channel) -- 호출
FROM prod.channel;

Trigger

  • INSERT, DELETE, UPDATE 실행 전후에 특정 작업을 수행하는 것
    • 대상 테이블 지정 필요
  • NEW, OLD modifier
    • NEW는 INSERT와 UPDATE에서 사용 가능
    • OLD는 DELETE와 UPDATE에서 사용 가능
CREATE TRIGGER test.before_update_keeyong_name_gender -- 트리거 생성
    BEFORE UPDATE ON test.keeyong_name_gender -- 업데이트 직전에
    FOR EACH ROW 
 INSERT INTO test.keeyong_name_gender_audit
 SET name = OLD.name, -- OLD : update로 바뀌기 전의 데이터
     gender = OLD.gender,
     modified = NOW();

UPDATE test.keeyong_name_gender
SET name = 'Keeyong'
WHERE name = 'Keeyong2';

Explain SQL

  • 쿼리가 어떻게 수행되는지 내부를 보여주는 SQL 명령
    • MySQL이 해당 쿼리를 어떻게 실행할 지 계획을 보여줌
    • 느리게 동작하는 쿼리의 최적화 가능
      • 일반적으로 문제가 되는 테이블에 인덱스를 붙혀 해결함

INDEX

  • Index는 테이블에서 특정 찾기 작업을 빠르게 수행하기 위해 MySQL이 별도로 만드는 데이터 구조 (B-tree)
  • 컬럼별로 만들어짐
  • Primary Key나 Foreign Key로 지정된 컬럼은 기본적으로 Index를 가짐
  • 인덱스를 사용하지 않으면 테이블을 처음부터 끝까지 읽어 시간이 많이 소모됨
  • SELECT, DELETE, JOIN 명령을 빠르게 하지만 INSERT, UPDATE 명령은 느리게 하는 단점 존재
  • 테이블에 너무 많은 인덱스를 추가하면 인덱스를 로딩하는 오버헤드로 인해 시스템이 전체적으로 느려짐
CREATE TABLE example (
    id INT NOT NULL AUTO_INCREMENT,
    index_col VARCHAR(20),
  PRIMARY KEY (id),
    INDEX index_name (index_col)
)