본문 바로가기

전체보기/Database

(8)
[MySql] Multiple-column Unique index 사용하기 intro 최근 회사에서 multiple-column unique index 사용할 일이 있었는데, 그 과정에서 알게된 사실들을 간단하게 정리해보려고 합니다. 우선 unique index를 사용이 필요한 상황을 간단하게 예시로 설명해보겠습니다. 아래와 같이 사용자의 정보를 정의한 테이블 있다고 가정해보겠습니다. name address 철수 서울 영희 경기도 영수 NULL 저희 서비스의 설계에서는 이름과 주소(address)의 조합이 unique할 필요가 있었고 동시에 주소 자체는 NULL과 중복을 허용할 필요가 있었습니다. 예를 들어, 위의 테이블에서 (철수, 경기도) 데이터는 철수가 겹치기 때문에 데이터가 적재되어서는 안되지만, (철희, 서울)은 이름/이름과 주소의 조합이 모두 unique하기 때문에 ..
[MySQL]Index 파헤치기 - multi-column index range scan(수정) 이번 글에서는 multi-column index를 사용하여 range scan이 동작하는 방식에 대해 정리해보겠습니다. 이번 글에서는 다음과 같은 환경에서 작성되었습니다. MySQL v8.0.22 InnoDB v8.0.22 Multi-Column indexes 사용시에 range scan 우선 설명을 위해 다음과 같은 테이블을 정의하였습니다. CREATE TABLE `example`.`user` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NOT NULL, `age` INT NOT NULL, `birthday` DATE NOT NULL, PRIMARY KEY (`id`), KEY `idx_user_birthday_name_age` (`birthd..
[MSSQL] DECIMAL 사칙연산 파헤치기 이번 글에서는 DECIMAL 타입에서 사칙연산이 동작하는 방식에 대해서 정리해보겠습니다. DECIMAL 연산에 대한 설명에 앞서서 간단하게 DECIMAL이라는 타입에 대해 알아보겠습니다. DECIMAL은 Precision과 Scale로 정의되어 있습니다. Precision은 전체 자릿수, Scale은 .(점) 오른쪽에 오는, 소수 자릿수를 의미합니다. SELECT CAST(1.0005 as DECIMAL(4, 3)) 위 예시에서는 그림과 같이 precision과 scale을 표시할 수 있고 scale의 범위를 넘은 소수점의 값(5)은 반올림 하여 위 query의 결과는 1.001이 됩니다. (정수가 자릿수를 초과할 경우에는 overflow error가 발생합니다.) Calculation 그럼 DECIMA..
[MSSQL] Collation 충돌 해결하기 intro 이번 글에서 collation 충돌이 발생하는 원인과 해결 방법에 대해 다뤄보겠습니다. 이번 글에서는 collation에 대한 설명은 따로 하지 않겠습니다. collation에 대해 알고싶으신 분은 다음 링크를 참고해 주시기 바랍니다. 설명을 위해 다음과 같은 두 테이블을 정의하겠습니다. CREATE TABLE korean (id INT, name VARCHAR(100) COLLATE Korean_Wansung_CI_AS) CREATE TABLE american (id INT, name VARCHAR(100) COLLATE Latin1_General_100_CI_AS_SC) 하나의 테이블 collation 값은 Korean_Wansung_CI_AS(한국어 사전 기준)으로 또 다른 하나의 테이블..
[MSSQL] Collation 파헤치기 intro 이번 글에서는 문자 데이터 정렬, Collation에 대하여 살펴보겠습니다. collation은 데이터 정렬, 비교하는 방식을 지정하는 명령어로 collation 설정에 따라 작업 결과가 다르게 나타날 수 있습니다. 자세한 설명에 앞서, 다음 쿼리를 통해 우리가 사용하고 있는 collation 설정값을 확인해 보겠습니다. SELECT name, collation_name FROM sys.databases; 위 쿼리문을 실행하면 아래와 같은 ( 환경에 따라 값은 다르게 나옵니다. ) 결과를 확인할 수 있습니다. name collation_name 1 master Korean_Wansung_CI_AS 2 sample Korean_Wansung_CI_AS master와 sample은 데이터베이스의 ..
[Database]Isolation level 파헤치기 - 서로 다른 isolation level을 가진 transaction들은 어떻게 동작할까? 이전 글에서 Isolation level이란 무엇인지 간단하게 설명하였습니다. https://devonce.tistory.com/22 [Database]Transaction과 isolation level Transaction이란? Transaction이란 데이터베이스에서 실행하는 작업의 단위를 의미합니다. 이번 글에서는 송금하는 과정을 예제로 전체적인 개념들을 설명하고자 합니다. 또한 테스트를 위해 MySQL(InnoDB)을 활용.. devonce.tistory.com 하지만 해당 글의 예제에서는 transaction의 isolation level을 동일하게 설정하고 설명을 진행했습니다. '그렇다면 서로 다른 isolation level을 가진 transaction들은 어떻게 동작할까?' 라는 의문이 들..
[MySQL] Delimiter 란? 이번 글에서는 MySQL의 Delimiter 명령어에 대해 다뤄보겠습니다. 최근 Procedure를 정의하면서 다음과 같은 SQL문을 사용하였습니다. mysql> DELIMITER $$ mysql> CREATE PROCEDURE insert_test() -> BEGIN -> DECLARE i INT; -> SET i = 0; -> WHILE i INSERT INTO account(createDatetime) VALUES(now()); -> SET i = i + 1; -> END WHILE; -> END $$ mysql> DELIMITER ; 맨 처음과 끝에 Delimiter 명령어를 사용하였습니다. 본 글은 Delimiter에 관한 글이기 때문에 Procedure와 다른 명령어..
[Database]Transaction과 isolation level Transaction이란? Transaction이란 데이터베이스에서 실행하는 작업의 단위를 의미합니다. 이번 글에서는 송금하는 과정을 예제로 전체적인 개념들을 설명하고자 합니다. 또한 테스트를 위해 MySQL(InnoDB)을 활용하였습니다. 예제는 다음과 같습니다. A라는 사람이 B라는 사람에게 송금을 하면, 아래와 같은 과정으로 이루어 진다고 가정하겠습니다. A 계좌에서 출금 B 계좌에 위에서 차감된 금액만큼 입금 송금은 2 단계로 나누어지지만 크게는 하나의 transaction(작업)이라고 할 수 있습니다. 하지만 데이터베이스 관련된 모든 작업을 transaction이라고 하지는 않습니다. Transaction은 다음과 같은 특징(ACID)을 가져야합니다. Atomic Atomic이란 '원자의'란 의..