MySQL

    [바미] MySQL - 프로시저에 대해 알아봅시다.

    서론 오늘은 DB 프로시저에 대해 알아보도록 하겠습니다. 간혹 REST API를 처리할 때 사용하기도 하는데 이 프로시저가 어떤 상황에서 유리할 수 있는지 알아보도록 하겠습니다. DB 프로시저? DB 프로시저(Database Procedure)로 부르기도 하고, 저장 프로시저(Stored Procedure)라고 부르기도 하는데 쉽게 설명해서 데이터베이스에서 실행되는 일련의 SQL 문과 선택적 제어문의 집합을 의미합니다. 이러한 프로시저는 특정 작업을 수행하기 위해 SQL 문을 하나의 실행 가능한 블록으로 그룹화 하는데 DB 프로시저는 데이터베이스시스템 내부에 저장되어 있으며, 필요할 때마다 호출하여 사용할 수 있습니다. 프로시저는 데이터 검증, 데이터베이스 내 연산 수행, 복잡한 비즈니스 로직 실행 등에..

    [바미] MySQL - Upsert

    데이터베이스에 레코드를 삽입할 때 해당 레코드의 키가 이미 존재하면 업데이트를 실행하는 기능을 말하는데 중복 삽입을 방지하고, 기존 레코드를 필요에 따라 갱신할 수 있도록 할 때 굉장히 유용한 쿼리에요. MySQL에서는 주로 INSERT ... ON DUPLICATE KEY UPDATE 구문을 사용해요. INSERT ... ON DUPLICATE KEY UPDATE INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...) ON DUPLICATE KEY UPDATE 컬럼1 = 값1, 컬럼2 = 값2, ...; INSERT ... ON DUPLICATE KEY UPDATE 구문은 레코드를 삽입하려 할 때 유니크 제약 조건 (PRIMARY KEY, UNIQUE INDEX..

    [바미] MySQL SELECT된 결과를 INSERT하기

    INSERT INTO 목표테이블 (컬럼1, 컬럼2, ..., 컬럼N) SELECT 컬럼1, 컬럼2, ..., 컬럼N FROM 출처테이블 WHERE 조건; 위와 같은 패턴을 가지고 있는데요. 서로 다른 테이블에 INSERT 할 때 INSERT INTO new_users (id, name, email) SELECT id, name, email FROM users WHERE active = 1;​ users 테이블에서 활성 상태인 사용자들의 id, name, email 정보를 선택하여 new_users 테이블에 삽입되는 예시입니다. INSERT INTO orders_analysis (order_id, order_date, customer_id, total_amount) SELECT order_id, order..

    [바미] 트랜잭션 데드락(Transaction DeadLock)

    Transaction 트랜잭션은 하나의 작업을 수행하는데 필요한 데이터베이스의 연산을 모아놓은 것으로 데이터베이스 작업의 단위라고 생각하면 됩니다. 일반적으로 데이터베이스의 연산은 SQL문으로 이루어져 있으며 트랜잭션을 SQL문의 집합이라고도 합니다. 트랜잭션에서 중요한 것은 트랜잭션 단위로 구분해서 모두 성공하거나 실패해야 데이터베이스의 일관성을 유지할 수 있다는 것입니다. (트랜잭션 특징中) Transaction Update 트랜잭션에서 UPDATE작업을 할 때 처리과정은 아래와 습니다. UPDATE TABLE SET A = 300 WHERE A_ID = 201; 위의 쿼리를 실행하면 행 레벨 Lock UNDO SEGMENT Buffer 확보 및 정보 기록 데이터 UPDATE COMMIT & 행 Un..

    [바미] MySQL 트랜잭션과 락 - InnoDB 락, 이렇게 동작한다!

    트랜잭션과 락(Transaction, Lock) 트랜잭션과 락 트랜잭션 : 논리적인 작업 단위로 전부 처리되거나 처리되지 않는 (commit/rollback) 원자성을 보장하기 위한 기능이다. 락 : 서로 다른 작업에서 같은 자원을 동시에 필요로 할 때 자원 경쟁이 일어나는데, 이때 순서대로 사용되는 동시성을 보장하기 위한 기능이다. MySQL에서 사용되는 락(LocK)은 크게 MySQL 엔진 레벨의 락과 스토리지 엔진 레벨의 락으로 나눠볼 수 있다. 스토리지 엔진 레벨의 락 스토리지 엔진(InnoDB)에서 제공하는 락(Lock, 잠금)이 있다. 기본적으로 비관적 락(Pessimistic locking)을 사용한다. 비관적 락 : 트랜잭션에서 변경하려는 레코드에 대해 락을 획득하고 쿼리를 수행하는 방식 ..

    MySQL 인덱스에 대해서

    안녕하세요. 오늘은 인덱스에 대한 정리를 해볼까 합니다. 인덱스라는 단어는 DB를 다루시거나 공부해보신 분들이라면 한 번쯤은 들어보셨을거라 생각됩니다. 하지만 인덱스가 무엇인가요? 라는 질문에 답변에 "아~ DB에서 쓰는 그거!" 라고 하신 경험 있으실겁니다. 그런 분들에게 제 글이 도움이 되었으면 좋겠습니다. 인덱스(Index)란? 사전적인 의미로는 데이터베이스에서 검색 속도를 향상시키기 위한 데이터 구조로 정의 되어 있지만 쉽게 설명하면 일종의 책 뒤의 찾아보기나 책 앞의 목차의 개념으로 이해하면 돼요. 데이터베이스 테이블에 존재하는 컬럼(열)들의 값을 기반으로 생성되고, 이 값들을 정렬하고 효율적인 검색을 가능하도록 만드는 역할을 가지고 있습니다. 데이터베이스의 테이블에 대한 빠른 검색 및 조회를 ..

    [바미] workbench에서 readonly 해제하기

    SELECT * FROM 테이블; 형태로 테이블을 조회할 때 위의 그림처럼 Read Only가 뜰 때는 조회하는 테이블에 pk(primary key)가 지정되지 않아 발생하는 문제입니다. 그러므로 PK를 지정해주시면 되겠습니다. ALTER TABLE `table`.`readonly` ADD PRIMARY KEY (`no`);

    [바미] 데이터 베이스 서버 성능 튜닝

    서버 성능 튜닝 데이터베이스 서버 성능 튜닝은 성능 이슈를 해결하기 위해 수행되는 과정을 말하는데 아래와 같은 과정으로 진행하고 있습니다. 성능 모니터링: 서버의 리소스 사용량과 성능 지표를 수집하여 이를 통해 성능 이슈를 파악합니다. 성능 분석: 수집된 데이터를 분석하여 성능 이슈가 발생하는 원인을 파악합니다. 성능 최적화: 성능 이슈의 원인을 파악한 후 성능 최적화를 위한 적절한 조치를 취합니다. 이를 위해 데이터베이스 설정 및 쿼리 최적화, 인덱스 생성 및 관리, 캐시 전략 등을 적용합니다. 캐시 최적화: 데이터베이스 서버에서 사용되는 캐시 정책을 최적화하여 쿼리 성능을 개선할 수 있습니다. 쿼리 최적화: 쿼리문을 최적화하여 성능을 개선할 수 있습니다. 하드웨어 업그레이드: 하드웨어 사양을 업그레이..

    [바미] 데이터 베이스 트랜잭션 관리

    데이터 베이스 트랜잭션 관리란, 데이터베이스에서 수행하는 여러 개의 작업들을 하나의 논리적 단위로 묶어서 처리하는 것을 말합니다. 트랜잭션은 ACID(Atomicity, Consistency, Isolation, Durability)라는 4가지 속성을 가지고 있습니다. 원자성(Atomicity): 트랜잭션은 원자적으로 수행되어야 하며, 트랜잭션 안의 모든 작업들이 한꺼번에 성공하거나, 실패해야 합니다. 일관성(Consistency): 트랜잭션이 수행되면서 데이터베이스의 정합성을 유지해야 합니다. 격리성(Isolation): 트랜잭션끼리는 각자 독립적으로 수행되어야 합니다. 내구성(Durability): 트랜잭션이 성공적으로 완료되더라도 (시스템 실패가 일어나더라도) 그 결과가 데이터베이스에 계속 유지되어..