Database 55

트랜잭션은 언제 시작되고 언제 종료되는가? (트랜잭션 시작 시점과 종료 시점)

트랜잭션(Transaction) 종료 시점 "트랜잭션은 언제 종료되는가"에 대해 알아보자. 먼저 트랜잭션의 종료 시점을 알아보기에 앞서 시작 시점을 먼저 알아보자! 트랜잭션이 자동으로 시작되는 시점은 아래와 같다. DML(INSERT, UPDATE, DELETE) 문장이 실행되는 경우 DDL(CREATE, ALTER, DROP) 문장이 실행되는 경우 DCL(GRANT, REVOKE) 문장이 실행되는 경우 트랜잭션은 아래와 같은 상황에 자동으로 종료 된다. COMMIT, ROLLBACK 문을 실행한 경우 DDL 또는 DCL 문 실행 기계 장애 또는 시스템 충돌(crash) deadlock 발생 강제 종료 DDL(Create, Alter, Drop, Truncate) 또는 DCL(Grant, Revoke)문..

Database/SQL 2022.05.02

Database - 교착상태 문제를 해결하는 방법!

DB(데이터베이스)에서의 교착상태 운영체제에서 교착상태(Dead Lock)는 각각의 프로세스가 서로의 자원을 점유하기 위해 대기하면서 문제가 발생한다 DB(데이터베이스)에서 교착상태는 여러 개의 트랜잭션(Transaction)들이 실행을 하지 못하고 서로 무한정 기다리는 상태를 의미한다. 트랜잭션 1이 테이블 B에 insert하게 되면서 첫 번째 행의 Lock(잠금)을 얻는다. 트랜잭션 2도 테이블 A의 첫 번째 행의 Lock(잠금)을 얻는다. Transaction 1> start transaction; insert into B values(1); Transaction 2> start transaction; insert into A values(1); 여기서 트랜잭션을 commit 하지 않은채 서로의 첫..

Database/SQL 2022.04.20

MySQL - WHERE 절에서의 인덱스 사용 (+인덱스를 사용하지 않는 쿼리)

Index In Where clause SQL문 튜닝에 있어서 Where절은 중요합니다. SQL문은 Where절이 가장 먼저 실행되고 Where절을 어떻게 설계하냐에 따라 Index를 활용한 조회를 하지 않고, 무식한 Full Scan을 할 수도 있기 때문입니다. 개발자 분들이 흔히 놓칠 수 있는 인덱스를 안타는 Where절 예시와 튜닝에 대해 포스팅했습니다. LIKE '%_ ' 또는 LIKE '%_%' 문자열을 검색할 때 LIKE절을 많이 사용합니다. 그런데 인덱스를 타고 있지 않을 수도 있습니다. EXPLAIN SELECT * FROM employees WHERE first_name LIKE "David%" 이 경우에는 인덱스를 잘탑니다. 하지만 아래의 경우들에는 인덱스를 잘 타지 않습니다. EXPL..

Database/SQL 2022.03.20

MySQL - 쿼리 성능(실행 시간, CPU 사용량 등) 확인하는 방법 [Profiling]

MySQL Profiling MySQL에서 실행한 쿼리들이 각 수행 시간이 얼마가 걸렸는지 확인할 수 있는 기능으로 쿼리 프로파일링(Query Profiling)을 제공합니다. profiling 설정을 활성화하면 앞으로 실행되는 모든 쿼리문의 수행 시간을 기록합니다. profiling 속성은 적지 않은 부하를 생성하기 때문에, 기본값으로는 OFF로 되어있습니다. Profiling 옵션 확인 Profiling 옵션의 활성화 여부는 다음과 같이 확인합니다. SELECT @@profiling; 결과 값이 1이면 ON, 0이면 OFF 입니다. 활성화 쿼리 프로파일링을 다음과 같이 활성화합니다. SET profiling=1; 그리고 다시 SELECT @@profiling;으로 조회를 해보면 아래와 같이 활성화가 ..

Database/SQL 2022.03.20

SQL 튜닝 - SELECT 절과 WHERE 절에 동일한 함수가 사용될 때 [성능 비교]

1번? 여러번? SELECT 절에 있는 함수를 WHERE 절에도 사용하면서 그런 생각이 문득 들었습니다. "설마, 함수를 두 번 호출해서 계산하는건 아니겠지..? 그럼 낭비잖아!" SELECT emp_no, CONCAT(first_name, ' ', last_name) AS full_name FROM employees WHERE CONCAT(first_name, ' ', last_name) LIKE '%Robert%'; 찾아본 결과, 쿼리를 날리면 Oracle은 라이브러리 캐시, MySQL은 쿼리 캐시에 쿼리 결과를 캐싱해서 재사용한다고 합니다. (소프트 파싱) -> 하지만, 라이브러리 캐시, 쿼리 캐시는 1개의 완성된 쿼리 단위로 동작합니다. 즉, WHERE절에서 나온 결과를 SELECT절에서 재사용하..

Database/SQL 2022.03.17

Master-Slave를 사용하는 이유 (Replication 장단점)

데이터베이스 다중화 많은 DBMS가 데이터베이스 다중화를 지원합니다. 보통은 Master-Slave 패턴을 자주 사용하는데, 데이터 원본은 주(Master)서버에, 사본은 부(Slave)서버에 저장하는 방식입니다. Master-Slave 쓰기(Write)는 마스터에서만 지원하고, 부(Slave)서버는 DB사본을 갱신하면서, 읽기만을 지원합니다. 통상 애플리케이션은 읽기 연산 비중이 훨씬 크기 때문에 아래와 같은 구성으로 많이 사용합니다. 즉, 설계안은 다음과 같이 동작합니다. 동작 원리 사용자는 URL로 사이트에 접속하면 로드밸런서 IP 주소를 받습니다. 사용자는 로드밸런서에 접속합니다. 사용자의 요청은 웹 서버1 또는 웹 서버2로 전달됩니다. 웹서버는 쓰기(Write)라면 MasterDB, 읽기(Rea..

Database/Server 2022.02.25

MySQL - datetime("0000-00-00") 사용하면 안되는 이유! (+ 에러 임시 해결)

"0000-00-00 00:00:00" error? 이번 주 회사에서 예약 서비스를 개발하다가 발생한 문제입니다. 회사에서 mysql의 datatimes값으로 0000-00-00 00:00:00 등의 format을 많이 사용하고 있었습니다. 그런데 문제가 발생해서 이런 값 사용은 절대 지양했으면 좋겠다고 생각하게 되었는데, 이유를 말씀해드릴게요! 1. DB Error: Incorrect datetime value MySQL 8.0의 sql_mode은 기본값으로 아래 세팅들을 포함하고 있습니다. ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSITUTION 저기..

Database/SQL 2022.02.20

SQL - 트랜잭션 범위 개선

트랜잭션 트랜잭션은 최소의 단위로 설정하는 것이 중요합니다. 아래 예제는 사용자가 게시판에 게시물을 작성한 후 저장 버튼을 클릭했을 때 서버의 동작을 순서대로 정리한 것입니다. 1) 처리 시작 => 데이터베이스 커넥션 생성 => 트랜잭션 시작 2) 사용자의 로그인 여부 확인 3) 사용자의 글쓰기 내용의 오류 여부 확인 4) 첨부로 업로드된 파일의 확인 및 저장 5) 사용자의 입력 내용을 DBMS에 저장 6) 첨부 파일 정보를 DBMS에 저장 7) 저장된 내용 또는 기타 정보를 DBMS에서 조회 8) 게시물 등록에 대한 알림 메일 전송 9) 알림 메일 발송 이력을 DBMS에 저장 => 트랜잭션 종료(COMMIT) => 데이터베이스 커넥션 반납 10) 처리 완료 개선 사항 1. 트랜잭션이 처리 시작과 동시에..

Database/SQL 2022.02.13

MySQL - 슬로우 쿼리 로그 설정 (자동으로 느린 쿼리 로그 남기기)

Slow Query Log 슬로우 쿼리 로그는 MySQL이 지원하는 느린 쿼리가 발생할 때마다 로그를 남겨주는 기능입니다. 슬로우 쿼리 로그는 on/off할 수 있고, 기준 시간 등을 설정할 수 있습니다. 설정 먼저 운영 중인 MySQL에 접속한 후, 아래의 SQL문을 수행합니다. show variables like 'slow_query_%'; 그러면 슬로우 쿼리 로그의 사용 여부와 로그의 경로가 나올겁니다. 저는 사용중이네요. 슬로우 쿼리 로그를 on 하거나 설정을 변경하려면 윈도우 환경이면 my.ini 리눅스면 my.cnf를 수정합니다. 윈도우이신 분은 C:\MySQL\MySQL Server 8.0 경로에 있습니다. 위 부분을 수정하시면 되고, slow-query-log는 1이 on, 0이 off입니..

Database/SQL 2022.02.06

Real MySQL - MySQL 기본 구조(+ 쿼리 실행 과정, 메모리 할당 구조, ...)

MySQL 서버 구조 MySQL은 아래의 그림과 같은 구조로 구성되어 있습니다. 각 시스템의 역할은 아래의 내용인 쿼리 실행 과정을 참고부탁드립니다. 쿼리 실행 과정(순서) 쿼리 실행은 아래 그림으로 설명할 수 있습니다. 각 시스템의 역할을 간략하게 설명하면 아래와 같습니다. Parser(파서) - 파서는 사용자의 요청으로 들어온 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 만들어 내는 작업을 합니다. 쿼리의 기본 문법 오류는 이 단계에서 발견되며 사용자에게 오류 메세지를 통보합니다. Pre-processor(전처리기) - 파서에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인 합니다. 각 토큰을 테이블 이름이나 칼럼 이름 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 ..

Database/SQL 2022.02.05