1. 정의 1-1 Write Skew란 두 개 이상의 트랜잭션이 동시에 동일한 조건을 읽고, 서로 다른 데이터를 수정 하면서 데이터 정합성 및 비즈니스 규칙이 깨지는 현상이다. a. 동일한 조건을 읽고 같은 row의 다른 컬럼을 업데이트 하는 경우 데이터 정합성이
1. 정의 1-1 Lost Update란 여러 트랜잭션이 동시에 데이터를 변경하는 과정에서, 한 트랜잭션의 수정 내용이 다른 트랜잭션의 수정 내용에 의해 덮어씌워져 최종적으로 의도와 다른 값이 저장되는 현상을 말한다. 이번 글에서는 MySQL, PostgreSQL,
지금까지 회사에서 근무하며 대표적인 3가지 RDBMS를 다룰 기회가 있었다.이제 각 데이터베이스별 격리 수준에 따른 동작 원리를 비교해 보려고 한다.(격리수준에 락을 조합하게 되면 생각할 부분이 많아지는데, 해당 내용은 생략하겠다.)트랜잭션의 격리 수준(Isolatio
왜 S-Lock를 먼저 걸고, X-Lock를 걸어야 하는가 ? PK는 유니크 제약 보장을 위해서, DML은 레코드 존재시 S-Lock 필요어떻게 삭제된 레코드에 대해서 Lock를 걸수 있는가 ? \- 레코드는 삭제되더라도 일정 기간동안 Deletion-mark만
UNION DISTINCT임시 테이블을 사용하여 중복 제거후 결과 반환MySQL 서버는 모든 결과를 임시 테이블로 처리 후 클라이언트로 결과 반환일반적으로 UNION 명령어만 입력하면 UNION DISTINCT로 작동함 UNION ALL임시 테이블 사용 과정이 없음My
SELECT FOR UPDATAE NOWAIT잠금 대상 레코드가 다른 세션에 잠겨있는 경우 대기가 아닌 바로 에러를 반환innodb_lock_wait_timeout 옵션을 0으로 설정한 것과 유사한 효과 (기본값 50)트랜잭션 내에서 NOWAIT 쿼리를 실행하여 에러가
인덱스를 사용하지 못하고 풀스캔으로 처리되는 경우1\. 컬럼이 가공되는 경우연산함수형변환2\. 인덱싱 되지 않은 컬럼을 조건에 OR 연산과 함께 사용3\. 복합 인덱스의 컬럼 중 선행 컬럼을 조건에서 누락4\. LIKE 연산에서 시작 문자열로 와일드 카드를 사용%Est
(이 부분은 간단하게 정리만 하고 넘어간다)B-Tree 인덱스의 성능 저해 요소이다일반적으로 UUID 컬럼은 유니크 제약을 필요로 한다. MySQL에서 인덱스의 변경은 change buffer 공간을 이용하여 빠르게 처리되는데, 유니크 제약을 가지게 되면 change
가독성의 중요성빠른 의도 파악빠른 디버깅유지보수 용의1\. DISTINCT를 항수처럼 사용하는 형태 지양괄호와 함께 사용한다 하더라도 그렇지 않은 경우와 결과가 동일하다. 오해의 여지가 있으므로 괄호 없는 형태로 사용하자2\. LEFT JOIN 사용 방법 준수LEFT
PREPARED STATEMENT?Binding QuerySQL Injection을 방지할 수 있다2번째 이후 실행시 캐싱을 통해 파싱 비용이 감소된다캐싱을 하기 때문에 메모리 사용량 증가첫 번째 실행시 PREPARED STATEMENT 단계가 필요하기 때문에 네트워크
주의사항쿼리에 대해 필터링 한 조건이 없이 LEFT JOIN을 사용하기 때문에 왼쪽에 위치한 user 테이블의 모든 컬럼을 리턴한다.on 절에 조건이 주어졌을 때는 각 테이블의 데이터를 연결하는 역할을 수행하는 반면 where 절에 조건을 명시함으로서 필터링 하는 역할
Global Error언어별 드라이브에서 발생 Server Errorsql 서버에서 발생Client Error언어별 드라이브나 커넥트에서 발생MySQL 에러 포맷에러포맷은 3개의 파트로 구성 (Error No, SQLState, Error Message)Error No
Generated 컬럼정의된 표현식에 따라 컬럼의 값이 자동으로 생성 \- 표현식: 고정된 값, 함수 또는 다른 컬럼들에 대한 연산 조합 등이 해당 사용자가 직접 값을 입력하거나 변경할 수 없음두 가지 종류가 존재 \- Virtual Generated Colum
SELECT순수 SELECT는 트랜잭션 격리 수준에 따라 데이터를 반환SELECT FOR UPDATE격리 수준과 무관하게 항상 최신 커밋 데이터를 조회한다. 따라서 단순 SELECT와 다른 결과를 반환할 수 있다단점일반적인 프로그램 구현에서 SELECT FOR UPDA
각 행에 대해 서브쿼리를 실행시킬 수 있는 기능이다. 고객(Customer)와 주문(Order) 테이블로 예시를 들어보자.CustomerOrder각 고객의 총 주문 금액을 구하고, 각 고객의 이름과 함께 결과를 출력한다.서브쿼리를 사용하지 않고 수행Lateral Der
일반적인 생각일반적으로 COUNT()는 빠를것으로 기대하지만 SELECT 보다 느린 경우가 있다.ORM에서 자동 생성된 쿼리는 훨씬 부하가 큰 COUNT(DISTINCT)를 실행하기도 한다.SELECT 는 LIMIT와 동시에 사용되지만, COUNT()는 단독으로 사용
공통점 문자열 속성 값을 저장 최대 65,535 Byres 까지 저장 가능 차이점 TEXT 타입 컬럼은 인덱스 생성 시 반드시 Prefix 길이 지정 필요 ( CREATE INDEX istextcolumn ON table (text_column(100)); TEXT
공통점문자열 저장용 컬럼최대 저장 가능 문자 길이 명시(바이트 수 아님) 차이점CHAR는 고정된 공간을 할당 (CHAR(8)로 선언 시 글자를 몇개를 넣든 8바이트의 공간을 차지)VARCHAR는 가변형 문자이기 때문에 데이터 길이가 변함 (VARCHAR(8)로 선언시
회사 서비스에 설정된 데이터 베이스와 데이터를 docker를 이용하여 로컬환경에 그대로 가져와보자. cat dump-slmaindev-202403191416.sql | docker exec -i e14a8934b857 /usr/bin/mysql -u -root --p
락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요하다. (락의 범위가 길어진다 -> 커넥션 풀 점유 시간이 길어진다 -> 커넥션 풀의 자원이 줄어든다) MySQL 트랜잭션의 커밋 혹은 롤백 시점에 잠금이 풀린다. -> 트랙잭션이 곧 락의 범위이다
테이블에 접근하지 않고 인덱스로만 데이터 응답을 내려줄 순 없을까 ?예시 상황Users라는 테이블이 있고, 이 테이블에는 다음과 같은 컬럼들이 있다.UserID (기본 키)FirstNameLastNameEmailAge자주 실행되는 쿼리 중 하나가 사용자의 FirstNa
인덱스의 핵심은 탐색범위를 최소화 하는 것HashMap키와 값이 있어 단건 검색 속도는 O(1)범위 탐색은 O(N)like 'AB'% 같은 검색은 키를 하나씩 꺼내서 비교해야 하기 때문에 사실상 불가List정렬되지 않은 리스트 탐색은 O(N) (어디서부터 탐색해야 할지
맥북에서 헤매는 나를 구원해줄 글이다. brew 설치mysql 설치mysql 실행 명령어 모음brew 삭제 및 실행 리스트 보기