1. 문제 상황PostgreSQL 에서 nullable 한 column 의 값이 변경이 되면 History 데이터를 쌓도록 Trigger 를 만들고 있었습니다.if OLD.purpose NEW.purpose 인 경우 Trigger 가 실행 되도록 했다. 그런데 purpose 값을 바꿔도 History 데이터가 생성이 되지 않았습니다.purpose 가 아닌 다른 값을 변경하는 경우에는 정상적으로 Trigger 가 동작하는 것으로 봐서는Trigger 가 적용이 안 된 문제는 아닌 것 같은데 ... 2. 문제 원인문제의 원인을 알아냈습니다. 설명하기 전에 아래의 쿼리의 결과를 예상해봅시다 ! select null = null, null null, null = 1, null 1, 1 = 1, ..
# 인덱스가 궁금하신 분들은 아래 글을 참고해 주세요 ![MySQL] Index, B-Tree란 ? ( 인덱스 키 값 계산 )🐳 사전 지식먼저 인덱스가 언제 사용되지 않는지 알기에 앞서 인덱스가 '사용' 된다는 의미를 이해할 필요가 있다.인덱스가 사용되는 방식조회시에 인덱스는 크게 두 가지 방법으로 사용된다.인덱스가 사용되는 두 가지 방법에 대해 살펴보자1. 작업 범위 결정 조건작업 범위 결정 조건은 말 그대로 작업의 범위를 결정하는 조건이다.쉽게 생각하면 조회의 범위를 좁히는데 사용되는 조건이다. 작업 범위 결정 조건의 특징은 아래와 같다.많으면 많을 수록 성능 향상에 영향을 준다인덱스를 효율적으로 사용했다는 의미이다.2. 체크 조건 / 필터링 조건체크 조건은 조회한 데이터를 사용자가 지정한 조건에 ..
🐳 1. 인덱스란 ?인덱스, 영어로는 색인이라는 의미이다.우리가 책에서 필요한 내용을 찾기 위해 목차를 보는 것처럼인덱스 또한 데이터베이스에서 우리가 찾는 데이터를 쉽게 찾을 수 있도록 해준다. 여기서 중요한 것은 데이터를 쉽게 찾을 수 있도록 해준다는 것이다.데이터를 삽입, 수정, 삭제를 도와주는 것이 아니다. 위에서 설명한 예시처럼 인덱스는 데이터의 읽기 속도를 높이는 기능을 의미한다. 그렇다면 인덱스의 단점은 무엇이 있을까 ?공학도라면 항상 해당 기술의 장단점을 생각해봐야 할 것이다. 인덱스는 저장하려는 Column 값을 항상 정렬된 상태로 유지해야 한다.그렇다는 것은 새로운 데이터를 삽입하는 경우 다시 데이터를 정렬해야 한다는 것이다.즉 인덱스는 저장 성능을 저하시킨다. 결론적으로 인덱스는 저장..
• 본 글은 도서 Real MySQL 8.0을 참고해 작성한 글입니다. 🐳 잠금(Lock)이란 ?잠금은 여러 커넥션 간의 동시성을 제어하기 위한 기능이다. 예시를 들어보자 !유저 A와 유저 B가 동시에 데이터 X를 UPDATE 하려고 한다면 어떻게 되야 할까 ?단계유저 A유저 B1단계데이터 X 업데이트를 시작함. 2단계데이터 X에 대한 잠금을 획득함. 3단계데이터 X를 성공적으로 업데이트. 4단계 데이터 X 업데이트를 시도함.5단계 데이터 X에 접근 불가, 잠금 대기 중. 유저 A가 해당 데이터 레코드 X에 대해 잠금을 획득하면 락이 해제 되기 전까지 다른 유저는 해당 데이터를 업데이트 할 수 없다. 위와 같이 같은 레코드에 대해 동시에 수정하려고 하는 경우 발생하는 동시성 문제를 제어하기 위한 기능..
🐳문제상황 시험 응시원서 시스템을 만드는 과정에서 접수번호( 시험번호 + 순차 증가하는 번호 ) 생성 로직에서 문제가 발생했다. 접수번호 생성 로직은 아래와 같다. 1. 현재 원서 중 가장 큰 접수번호를 조회한다. 2. 가장 큰 접수번호에 + 1을 하여 원서 접수 번호를 생성한다. 위의 로직에서 여러 원서를 동시에 접수할 경우 같은 접수번호를 가진 데이터 입력을 시도하게 되었고 접수번호 + 시험ID 값은 Unique 한 값이기에 에러가 발생했다. 이 문제는 여러 원서가 한 개의 원서 자원에 접근하여 발생한 동시성 문제이다. 만약 DB에 접수번호에 Unique를 설정해 주지 않았다면 같은 접수번호를 가진 원서가 발생해 큰 문제를 야기했을 것이다. 이 문제를 해결해보자 ! 🐳Database 의 Lock 기능..
문제상황 회사 사수가 DB 테이블에 외래키를 설정하는데 아무리 기다려도 ALTER TABLE 쿼리가 실행되지 않는 문제가 발생했다. 이 외에도 테이블 명 수정, 칼럼 명 수정, 외래키 지정, TRUNCATE 등 모든 DDL 쿼리문이 실행되지 않았다. 문제원인 문제 원인은 해당 테이블에 Transactional한 process가 끝나지 않아서 발생하는 문제였다. 참고한 자료는 다음과 같다. mysql bug report mysql 공식 문서 문제 해결을 위해서는 변경하려는 테이블에 완료되지 않은 Transaction을 정리해야 할 것으로 보인다. SHOW FULL PROCESSLIST 우선 완료되지 않은 process 목록을 보기 위해 아래의 쿼리문을 실행해 보자 SHOW FULL PROCESSLIST; ..