백엔드 데브코스 TIL 10일차

Inchang Choi·2022년 4월 2일
0
post-thumbnail

학습목표

강의를 들으며 내가 알고 있는 내용을 점검하고,

새로 배운 내용을 정리하며,

궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다.


트랜잭션

테이블 내용을 변경하는 SQL들이 연달아 실행 되며 이것들이 마치 하나의 SQL처럼 묶여서 성공과 실패를 반환해야한다면 트랜잭션의 사용을 고려 해볼 수 있습니다.

즉, 레코드를 수정/추가/삭제 할 때 의미를 가집니다.

예를 들어 은행 계좌에서 돈을 이체할 때를 생각해 볼 수 있습니다.

계좌 이체는 인출과 입금의 두 과정으로 나눌 수 있습니다.

만약 인출은 성공 했는데 입금이 실패한다면?

그런 경우들을 배제하기 위해 이 과정들은 하나로 묶일 필요가 있습니다.

BEGIN; --START TRANSACTION
	A의 계좌로부터 인출;
	B의 계좌로 입금;
END;  -- COMMIT

autocommit

--현재 오토커밋 모드 확인
SHOW VARIABLES LIKE 'AUTOCOMMIT';

-- 변경
SET autocommit=0 (or 1)
  • autocommit = True
    • 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여짐. 이를 커밋 된다고 합니다.
    • 만일 특정 작업을 트랜잭션으로 묶고 싶다면 BEGIN과 END로 처리합니다.
  • autocommit = False
    • 모든 레코드 수정/삭제/추가 작업이 commit이 호출 될 때까지 커밋 되지 않기 때문에 명시적으로 커밋을 해줘야 합니다.
    • ROLLBACK이 호출되면 앞서 작업들이 무시 됩니다.

View

자주 사용하는 SQL 쿼리에 이름을 주고 사용을 쉽게 하는 것을 View라고 합니다.

  • 이름이 있는 쿼리가 View로 데이터베이스단에 저장됩니다.
  • View가 사용될 때 마다 SELECT가 실행됩니다.
  • 이런 이유로 가상 테이블 이라고 부르기도 합니다.
CREATE OR REPLACE VIEW view_name AS SELECT ...

Stored Procedure

Stored Procedure는 MySQL 서버단에 저장되는 SQL 쿼리들을 의미 합니다.

프로그래밍 언어의 함수 처럼 인자를 넘기는 것이 가능합니다.

반환되는 값은 SELECT와 동일한 레코드들의 집합입니다.

간단한 분기문과 루프를 통한 프로그래밍이 가능하지만,

디버깅이 힘들고 서버의 부하를 증가 시킨다는 단점이 있습니다.

--정의
DELIMITER //
CREATE PROCEDURE procedure_name(parameter_list)
BEGIN
	statements;
END
DELIMITER ;

-- 호출
CALL stored_procedure_name(parameter_list);

Stored Function

특정 데이터베이스 밑에 등록 될 수 있는 값을 하나 반환해주는 server-side 함수입니다.

  • SELECT 안에서 사용 가능하며
  • 반환값은 Deterministic 혹은 Non Deterministic입니다
  • CREATE FUNCTION 으로 생성 할 수 있습니다.

Trigger

Trigger는 INSERT, DELETE, UPDATE 실행 전후에 특정 작업을 수행하는 기능입니다.

CREATE TRIGGER 명령을 사용하여 만들 수 있으며, 대상 테이블을 지정하여 사용합니다.

INSERT와 UPDATE는 NEW, DELETE와 UPDATE는 OLD라는 modifier를 사용할 수 있습니다.

Explain SQL

Explain SQL은 쿼리가 어떻게 수행되는지 내부를 보여주는 SQL 명령어입니다.

이러한 Execution Plan을 바탕으로 느리게 동작하는 쿼리의 최적화가 가능합니다.

보통 느린 쿼리의 경우 문제가 되는 테이블에 인덱스를 붙이는 것이 일반적입니다.

Index

Index는 테이블에서 특정 찾기 작업을 빠르게 수행하기 위해서 MySQL이 별도로 만드는 데이터 구조입니다.

Primary Key나 Foreign Key로 지정된 컬럼은 기본적으로 Index를 갖게 됩니다.

특정 컬럼을 바탕으로 검색을 자주 한다면 Index 생성을 고려해볼 수 있습니다.

INDEX와 KEY는 동의어?

Index는 SELECT, DELETE, JOIN 명령어를 빠르게 하지만 대신 INSERT, UPDATE 명령은 느리게 합니다.

테이블에 추가나 변경이 있을 경우 인덱스도 다시 만들어지기 때문에 쓰기 작업을 진행 할 경우 느려집니다.

테이블에 너무 많은 인덱스를 추가하면 인덱스의 로딩으로 인한 오버헤드로 인해 시스템이 전체적으로 느려질 수도 있습니다.

CREATE TABLE practice(
   ...
	INDEX index_name (index_col)
)
profile
always positive

0개의 댓글