Database 19

[DB Optimization#3] 인덱스(Index)란?

DB 성능을 높이기 위한 가장 대표적인 방법 중 하나는 인덱스(index) 를 활용하는 것입니다.많은 튜닝 기법이 존재하지만, 인덱스는 그 중에서도 기본이자 핵심입니다.이번 글에서는 인덱스가 무엇인지, 왜 필요한지, 어떻게 작동하는지를 예시를 통해 알아보겠습니다. 인덱스(Index)란?데이터베이스에서 인덱스는 검색 속도를 향상시키기 위한 자료 구조입니다.이는 데이터를 보다 빠르게 조회할 수 있도록 설계된 메커니즘입니다. 조금 더 직관적으로 말하자면, 인덱스는 특정 컬럼을 기준으로 데이터를 미리 정리해 둔 ‘찾기 쉬운 목록’이라고 이해하면 됩니다.마치 책의 목차처럼, 원하는 정보를 빠르게 찾아갈 수 있도록 돕는 역할을 합니다. 예를 들어 아래와 같은 users 테이블이 있다고 가정해봅시다. id n..

SQL 2025.04.16

[DB Optimization#2] MySQL 구조

개발을 하다 보면 어느 순간부터 데이터베이스가 느려졌다는 이야기를 듣게 됩니다.특히 서비스가 실제 사용자에게 제공되는 시점이 되면 SQL 응답 속도가 체감될 정도로 느려지는 현상을 마주하게 됩니다.이럴 때 무작정 쿼리를 수정하기보다 먼저 해야 할 일은, MySQL 내부 구조를 이해하는 것입니다. MySQL 구조를 왜 알아야 할까?SQL이 어떻게 실행되고, 어떤 과정에서 성능 병목이 발생하는지 이해하지 못하면문제의 원인을 파악하기도 어렵고, 제대로 된 튜닝도 할 수 없습니다.MySQL의 구조를 이해하면 다음과 같은 질문에 답할 수 있습니다.어떤 단계에서 성능 저하가 발생하는가?어떤 요인이 병목을 유발하는가?SQL 튜닝은 어떤 지점을 개선해야 하는가? MySQL 아키텍처 개요 MySQL에서 하나의 SQ..

SQL 2025.04.16

[DB Optimization#1] DB 성능 최적화란?

개인 프로젝트나 토이 프로젝트를 할 때는 데이터베이스(DB)의 성능 문제를 거의 느끼지 못합니다.하지만 실제 현업에서는 DB 성능 저하 문제를 한 번쯤 반드시 겪게 됩니다.페이지 로딩이 느려지거나, 조회 결과가 오래 걸리는 문제 말이죠.이런 성능 저하 문제는 단순한 불편함을 넘어서, 실제 사용자 이탈과 회사의 손실로 이어질 수 있습니다. DB 성능 저하, 왜 발생할까?동시 사용자 수의 증가→ 많은 사용자가 한 번에 접속하면 DB가 처리할 양도 급증합니다.데이터 양의 증가→ 수십만, 수백만 건의 데이터가 쌓이면 조회 속도가 점점 느려질 수 있습니다.비효율적인 SQL문 작성→ 가장 흔하면서도, 놓치기 쉬운 원인입니다. SQL이 느리면 어떤 구조든 느려집니다. DB 성능을 개선하는 대표적인 방법 방법 설명 ..

SQL 2025.04.16

[SQL#12] UNION / UNION ALL

SQL에서 UNION과 UNION ALL은 두 개 이상의 SELECT 결과를 수직으로 합치는 데 사용하는 문법입니다. 테이블 간의 관계가 없어도, 동일한 형식의 데이터를 한 번에 보여주고 싶을 때 유용합니다. 예시 테이블online_customers 테이블 id name 1Alice2Bob offline_customers 테이블idname3Charlie4Bob 1. UNIONSELECT name FROM online_customersUNIONSELECT name FROM offline_customers; name AliceBobCharlie→ Bob은 두 테이블에 모두 있지만, 한 번만 표시됩니다. 2. UNION ALLSELECT name FROM online_customersUNION ALLSE..

SQL 2025.04.16

[SQL#11] JOIN

SQL의 JOIN은 두 개 이상의 테이블을 연결해 하나의 결과로 보여주는 기능입니다.여러 테이블에서 관련 데이터를 가져올 때 필수적으로 사용되며, 특히 INNER JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN은 관계형 데이터베이스의 핵심입니다. 예시 테이블customers 테이블 customer_id name 1Alice2Bob3Charlieorders 테이블 order_id customer_id product 1011Keyboard1021Mouse1032Monitor1044Headset 1. INNER JOIN교집합과 같이 양쪽 테이블에서 조건이 일치하는 행만 조회합니다.SELECT *FROM customersINNER JOIN orders ON customers.cust..

SQL 2025.04.16

[SQL#10] CASE

SQL에서 CASE는 조건에 따라 다른 값을 반환하는 조건문입니다.프로그래밍 언어의 if-else나 switch처럼 사용할 수 있으며,데이터를 가공하거나 집계 값을 가로 방향으로 펼치는 피벗(pivot) 작업에도 자주 활용됩니다. CASE WHEN 조건1 THEN 결과1 WHEN 조건2 THEN 결과2 ... ELSE 기본값END WHEN과 THEN을 반복하여 여러 조건을 나열할 수 있습니다.ELSE는 생략 가능하며, 해당 조건이 없을 경우 기본값을 반환합니다.예시예시 테이블: sales id name region quarter amount 1AliceEastQ110002AliceEastQ215003BobWestQ120004BobWestQ225005CharlieEastQ1NULL6Charl..

SQL 2025.04.16

[SQL#9] GROUP BY / HAVING

SQL에서 데이터를 그룹 단위로 요약하거나 조건을 걸고 싶을 때 사용하는 문법이 GROUP BY와 HAVING입니다.특히 COUNT, SUM, AVG 등의 집계 함수와 함께 쓰일 때 강력한 기능을 발휘합니다. 1. GROUP BYGROUP BY 함수는 컬럼 내 공통된 값을 기준으로 데이터를 그룹화합니다.SELECT 그룹기준컬럼, 집계함수FROM 테이블명GROUP BY 그룹기준컬럼; SELECT department, COUNT(*) AS countFROM employeesGROUP BY department;→ 부서별로 몇 명의 직원이 있는지 집계departmentcountSales5HR2IT3 2. HAVINGHAVING 함수는 그룹화된 결과에 조건을 적용할 때 사용됩니다.SELECT 그룹기준컬럼, 집..

SQL 2025.04.16

[SQL#8] COUNT / SUM / AVG / MIN / MAX

SQL에서 데이터를 요약하고 분석할 때 가장 많이 쓰는 것이 집계 함수(aggregate function)입니다.대표적으로 COUNT, SUM, AVG, MIN, MAX가 있으며, 이 함수들은 여러 행을 하나의 값으로 요약할 때 사용됩니다. 이번 글에서는 집계 함수의 기본 사용법과 함께, NULL 처리 방식까지 함께 정리합니다. 1. COUNTCOUNT 함수는 컬럼별로 몇 개의 행이 존재하는지 세는 함수입니다.SELECT COUNT(컬럼명) FROM 테이블명; COUNT(*): 전체 행 개수 (NULL 포함)COUNT(컬럼명): 해당 컬럼이 NULL이 아닌 행만 집계SELECT COUNT(*) FROM users; -- 전체 회원 수SELECT COUNT(email) FROM users; ..

SQL 2025.04.16

[SQL#7] ROUND / CEIL / FLOOR

1. ROUNDROUND 함수는 숫자를 반올림할 때 사용하는 함수입니다.소수점 이하를 원하는 자리수까지 반올림하거나, 정수 단위로 반올림할 수 있습니다.ROUND(숫자, 소수점_자리수) 숫자: 반올림할 대상 숫자소수점_자리수: (선택) 소수점 아래 몇 번째 자리까지 남길지생략하면 정수로 반올림됨SELECT ROUND(3.14159, 1); → 결과: 3.1SELECT ROUND(3.6);→ 결과: 4 2. CEIL / FLOORCEIL 함수는 숫자를 올림할 때 사용하는 함수입니다.CEIL(숫자)→ 입력된 값보다 크거나 같은 가장 작은 정수 반환SELECT CEIL(3.2); -- 4SELECT CEIL(-1.3); -- -1 FLOOR 함수는 숫자를 내림할 때 사용하는 함수입니다.FLOOR(숫자..

SQL 2025.04.16

[SQL#6] SUBSTR

SUBSTR 함수는 문자열에서 일부만 잘라내는 함수입니다. 특정 위치부터 원하는 길이만큼 잘라서 새로운 문자열을 반환할 수 있습니다. SUBSTR(문자열, 시작위치, 길이)문자열: 자르고 싶은 대상 문자열시작위치: 자르기를 시작할 위치 (1부터 시작)길이 (선택): 자를 문자 수 (생략하면 끝까지)※ SUBSTRING()이라는 이름도 동일하게 사용 가능 SELECT SUBSTR('HelloWorld', 1, 5);→ 결과: 'Hello'→ 문자열의 1번째부터 5글자 추출 SELECT SUBSTR('HelloWorld', 6);→ 결과: 'World'→ 6번째부터 끝까지 추출 SELECT SUBSTR(phone_number, 1, 3) AS area_codeFROM users;→ phone_number의 ..

SQL 2025.04.16