Skip to content

MySQL ‐ Basic CRUD in MySQL

woojin.jang edited this page Apr 2, 2026 · 5 revisions

MySQL - Basic CRUD in MySQL

Optimizing CREATE Statements for Performance

INSERT INTO posts (user_id, category_id, title, content, status) VALUES
     (1, 1, '제목1', '내용1', 'PUBLISHED'),
     (1, 2, '제목2', '내용2', 'PUBLISHED'),
     (2, 1, '제목3', '내용3', 'DRAFT');

-- Prepared Statement로 반복 INSERT 최적화
PREPARE stmt_insert_comment FROM
    'INSERT INTO comments (post_id, user_id, content) VALUES (?, ?, ?)';
  • Prepared Statement를 사용하면 실행 계획 재사용이 가능하다.
  • DB가 SQL을 처리하는 과정은 다음과 같이 크게 4단계로 나뉜다.
    • 1단계: 파싱(Parse) - SQL 문자열을 토큰으로 쪼개고 문법 검증을 하는 단계, 문자열을 AST(Abstract Syntax Tree)로 변환하는 과정이다.
    • 2단계: 유효성 검증(Validate) - 테이블이 실제로 존재하는지, 컬럼 타입이 맞는지, 권한이 있는지를 카탈로그(메타데이터)를 조회해서 확인한다.
    • 3단계: 실행 계획 생성(Optimize/Plan) - 옵티마이저가 이 쿼리를 어떻게 실행할지 결정하는 단계, INSERT의 경우 단순해보이지만 인덱스가 몇 개 걸려있는지, 트리거가 있는지, 파티션 테이블인지에 따라 실행 경로가 다르다. SELECT의 경우 인덱스 선택, 조인 순서, 스캔 방식 등을 결정하는 가장 비용이 큰 단게이다.
    • 4단계: 실행(Execute) - 만들어진 실행 계획대로 실제 데이터를 쓰거나 읽는다.
  • 일반 Statement로 같은 INSERT를 1만 번 실행하면 1→2→3→4를 1만 번 반복한다. 쿼리 문자열이 매번 다르기 때문이다.
  • Prepared Statementprepare 시점에 1→2→3을 딱 1번 수행하고, 그 결과(실행 계획)를 DB 내부 캐시에 저장한다. 이후 execute할 때는 파라미터만 바인딩해서 4단계만 반복하기 때문에 1~3단계의 비용이 완전히 사라지게 된다.
-- 중복 시 에러 없이 건너뛰기
INSERT IGNORE INTO users (username, email, password_hash, display_name)
VALUES
    ('john_doe', 'john@example.com', SHA2('pass1', 256), 'John'),
    ('jane_doe', 'jane@example.com', SHA2('pass2', 256), 'Jane'),
    ('john_doe', 'john2@example.com', SHA2('pass3', 256), 'John2');
-- 중복 시 특정 컬럼만 업데이트
INSERT INTO users (username, email, password_hash, display_name, login_count)
VALUES ('john_doe', 'john@example.com', SHA2('pass', 256), 'John Doe', 1)
ON DUPLICATE KEY UPDATE
         display_name = VALUES(display_name),
         login_count = login_count + 1,  -- 기존값 + 1
         updated_at = CURRENT_TIMESTAMP;
-- 복잡한 업데이트 로직
INSERT INTO posts (user_id, category_id, title, content, view_count)
VALUES (1, 1, '제목', '내용', 1)
ON DUPLICATE KEY UPDATE
         content = CONCAT(content, '\n--- 업데이트됨 ---\n', VALUES(content)),
         view_count = view_count + VALUES(view_count),
         updated_at = CURRENT_TIMESTAMP;
-- 중복 시 기존 데이터 삭제 후 새 데이터 삽입
REPLACE INTO users (user_id, username, email, password_hash, display_name)
VALUES (1, 'john_updated', 'john_new@example.com', SHA2('newpass', 256), 'John Updated');
-- EXISTS를 이용한 조건부 삽입
INSERT INTO comments (post_id, user_id, content)
SELECT 1, 2, '댓글 내용'
WHERE EXISTS (
    SELECT 1 FROM posts
    WHERE post_id = 1 AND status = 'PUBLISHED'
)
  AND NOT EXISTS (
    SELECT 1 FROM comments
    WHERE post_id = 1 AND user_id = 2
      AND created_at > DATE_SUB(NOW(), INTERVAL 1 MINUTE)
);
-- 다른 테이블에서 데이터 복사
INSERT INTO posts (user_id, category_id, title, content, status)
SELECT
    user_id,
    1 as category_id,
    CONCAT('임시 제목 - ', user_id) as title,
    '자동 생성된 내용' as content,
    'DRAFT' as status
FROM users
WHERE status = 'ACTIVE'
  AND login_count > 10;

SELECT Query Optimization

Advanced SELECT Techniques for Complex Service Data

UPDATE & DELETE Guide

📖 Java

📖 Kotlin

📖 Coroutine

📖 Spring

📖 Spring Security

📖 Spring Batch

📖 Reactive Programming

📖 Database

📖 MySQL

📖 Redis

📖 JPA

📖 QueryDsl

📖 MSA

📖 Kafka

📖 Apache Flink

  • [Apache Flink - Apache Flink Architecture]
  • [Apache Flink - Stream Processing]
  • [Apache Flink - Data Stream API & Window]
  • [Apache Flink - State Management]

📖 HTTP

📖 AWS

📖 Docker

📖 Kubernetes

📖 CI/CD

📖 Nginx

📖 Monitoring🥈

  • [Monitoring - Log Concept]
  • [Monitoring - Log Level & Filter]
  • [Monitoring - Logback]
  • [Monitoring - Log Collection with ELK Stack]
  • [Monitoring - Log Monitoring with Kibana]
  • [Monitoring - Building a Monitoring System with Spring Boot Actuator]
  • [Monitoring - Server Monitoring with Prometheus and Grafana with Discord Alerts]

📖 Test

📖 Effective Java 3/E

📖 Kotlin Academy - Effective Kotlin

📖 Kotlin Academy - 핵심편

📖 스프링으로 시작하는 리액티브 프로그래밍

📖 가상 면접 사례로 배우는 대규모 시스템 설계 기초 1

📖 가상 면접 사례로 배우는 대규모 시스템 설계 기초 2

📖 Clean Code

📖 리팩토링 2판

📖 주니어 백엔드 개발자가 반드시 알아야 할 실무 지식

📖 GraphQL

Clone this wiki locally