DataBase
[MySQL] 트랜잭션 격리 수준(isolation level)
경쟁상태 (Race Condition) 여러 클라이언트가 같은 데이터에 동시 접근 시 생기는 문제 트랜잭션의 격리성(Isolation) 이란? 여러 Transaction은 동시에 수행될 수 있다. 이때 각 Transaction은 다른 Transaction의 연산 작업이 끼어들지 못하도록 보장하여 각각의 트랜젝션은 서로 간섭 없이 독립적으로 수행되어야 한다. 현재 수행 중인 트랜잭션이 완료될 때까지 다른 트랜잭션들이 중간 연산 결과에 접근할 수 없음을 의미한다. 따라서 동시에 수행되는 transaction이 동일한 data를 가지고 충돌하지 않도록 제어해줘야 한다. 이를 동시성제어(concurrency control) 라고한다. 즉, 격리성을 보장하기 위해서는 여러 트랜잭션이 동시에 수행되더라도 마치 순서..
[MySQL] 스토리지 엔진 수준의 락의 종류(레코드 락, 갭 락, 넥스트 키 락, 자동 증가 락)
스토리지 엔진 수준의 락의 종류 MySQL에서 사용되는 락은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다. 스토리지 엔진 레벨의 잠금은 테이블의 데이터를 다루기 위한 락이며, MySQL 엔진 레벨의 잠금은 테이블이나 데이터베이스 등과 같은 부분을 위한 락에 해당한다. 그리고 이번에 살펴볼 잠금은 스토리지 엔진 레벨(테이블의 데이터를 다루기 위한)의 잠금이다. 레코드 락(Record Lock) 갭 락(Gap Lock) 넥스트 키 락(Next Key Lock) 자동 증가 락(Auto Increment Lock) 레코드 락(Record Lock) 일반적으로 레코드 락은 테이블 레코드 자체를 잠그는 락을 의미한다. 레코드 수준의 잠금은 상당히 작은 공간으로 관리되기 때문에 레코드 락이 페이지..
[MySQL] Select 조건절 정리
DML에서 select는 너무 자주 사용되는 쿼리문이다. 그래서 이를 한번 싹~ 정리해보고자 포스팅을 작성한다. 우선 Select의 기본 사용법은 아래와 같다. SELECT FROM [ WHERE condition ] [ GROUP BY ] [ HAVING condition ] [ ORDER BY ]; 사실 SELECT ... FROM ... WHERE 에 가장 익숙할 것이다. 가장 자주 사용하는 키워드이기 때문이다. 그래서 WHERE절에서 사용할 수 있는 조건문, GROUP BY - HAVING 절과 ORDER BY에 대해 알아볼 예정이다. 비교 연산자 비교 연산자 설명 = 왼쪽 피연산자와 오른쪽 피연산자가 같으면 참을 반환함. !=, 왼쪽 피연산자와 오른쪽 피연산자가 같지 않으면 참을 반환함. = ..
[MYSQL] LIMIT / OFFSET 쿼리 & Paging 처리
limit 결과 중 처음부터 몇개만 가져오기 SELECT * FROM 테이블명 LIMIT 10; -- 처음 부터 10개만 출력하기 (1 ~ 10) SELECT * FROM 테이블명 LIMIT 100, 10; -- 100번째부터 그 후 10개 출력하기 (101 ~ 110) offest 어디서 부터 가져올지 SELECT * FROM 테이블명 ORDERS LIMIT 20 OFFSET 5; -- 5번째 행 부터 25행 까지 출력 (6 ~ 25) -- limit 5, 20 과 같다고 보면 된다. SELECT * FROM 테이블명 ORDERS LIMIT 5, 20 페이징 처리하기 사이트를 만들다보면 무조건 최소 한번은 Paging 을 처리해야하는 화면이 있다. Mysql 에서는 Limit 과 offset 을 제공하..
[MySQL] 파티션(Partition) 개념 & 사용법
파티션(partition) Partition이란 논리적으로 하나의 테이블이지만 실제로는 여러 개의 테이블로 분리해서 관리하는 기법을 말한다. 마치 동일한 형식의 한 개의 테이블을 사용하고 있는 것 같지만, 실제적으로는 여러 개의 물리 파일로 데이터들을 분할하여 보관하는 방식이다. Partition은 주로 대용량의 테이블을 물리적으로 여러 개의 소규모 테이블로 분산하는 목적으로 사용한다. 개념 정리 대량의 데이터를 테이블에 저장할 때, 물리적으로 별도의 테이블로 분리해서 저장시키는 기법을 말한다. 단, mysql은 내부적으로 분리되어 처리되기 때문에, 파티션이 얼마나 있든 사용자는 하나의 테이블로 보인다. 특정 DML과 Query의 성능을 향상시키고, 주로 데이터가 실시간으로 쌓이는 데이터베이스 환경에서..
[MySQL] 트리거(Trigger) 개념 & 사용법
Trigger (트리거) 트리거(Trigger)는 사전적 의미로 '방아쇠'라는 뜻이다. MySQL에서 트리거는 테이블에서 어떤 이벤트가 발생했을 때 자동으로 실행되는 것을 말한다. 즉, 어떤 테이블에서 특정한 이벤트(update, insert, delete)가 발생했을 때, 실행시키고자 하는 추가 쿼리 작업들을 자동으로 수행할 수 있게끔 트리거를 미리 설정해 두는 것이다. 예를 들어 고객이 물건을 구매해 구매 테이블에 정보가 insert되면, 등록된 트리거가 발동해 물품 테이블을 자동으로 update 쿼리문을 실행하게 하고, 또 등록된 트리거가 발동해 배송테이블에 insert 쿼리문을 실행시키게 끔 할 수 있다. 데이터베이스 트리거(Database Trigger)는 테이블에 대한 이벤트에 반응해 자동으로..
[MySQL] 스토어드 프로시저 & 스토어드 함수 사용법
스토어드 프로시저 프로시저는 일련의 쿼리를 모아 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. [ 프로시저 장점 ] 하나의 요청으로 여러 SQL문을 실행할 수 있다.(네트워크에 대한 부하를 줄일 수 있다.) 미리 구문 분석 및 내부 중간 코드로 변환을 끝내야 하므로 처리 시간이 줄어든다. 데이터베이스 트리거와 결합하여 복잡한 규칙에 의한 데이터의 참조무결성 유지가 가능하게 된다. 간단히 말하면 응용 프로그램 측 로직을 가지지 않고도 데이터베이스의 데이터 앞뒤가 맞게 될 수 있다. [ 프로시저 단점 ] 코드 자산으로서의 재사용성이 나쁘다.(이부분 때문에 실무에서 거의 안쓰는 편이다) 업무의 사양 변경 시 외부 응용 프로그램과 할께 프로시저의 정의를 변경할 필요가 있다. 스토어드 프로시저 사용..
[MySQL] 변수 종류 정리 (사용자 변수 / 지역 변수 / 시스템 변수)
사용자 정의 변수 사용자 정의 변수 선언 및 초기화 SET @변수이름 = 대입값; -- or SET @변수이름 := 대입값; SELECT @변수이름 := 대입값; SET 이외의 명령문에서는 = 가 비교연산자로 취급되기 때문에, SELECT 로 변수를 선언하고 값을 대입할 때는 := 를 사용한다. 사용자 정의 변수 사용법 SET @start = 15, @finish = 20; -- 또는 SELECT @start := 15, @finish := 20; SELECT * FROM employee WHERE id BETWEEN @start AND @finish; ※ 참고 저장하는 값에 의해 자료형이 정해지며, Integer, Decimal, Float, Binary 그리고 문자열 타입만 취급할 수 있다. 또한 ..
[MySQL] 제어문 (case / if) 정리
MYSQL 제어문 기본 적으로 제어문은 무얼 조회하기 보다는, 새로운 필드를 생성해서 뷰로 만드는데 목적을 둔다. 새로운 필드를 생성하고 각 필드값을 제어문으로 조건을 줘서 값을 결정하는 방식이다. CASE 문 CASE는 두가지 문법이 가능하다. 하나는 switch 같이 쓸 수 있고, 하나는 if문 같이 쓸 수 있다. switch문 value와 compare_value 값이 같으면, THEN 절을 반환 한다. 만약 서로 값이 같지 않으면, ELSE 절을 반환한다. 이때 ELSE 절이 없으면, NULL을 반환한다. CASE value WHEN compare_value THEN '반환 값' WHEN compare_value THEN '반환 값' ELSE 'WHEN 조건에 해당 안되는 경우 반환 값' EN..