본문 바로가기
데이터베이스

MySQL 쿼리 속도 향상하기: 실습 가능한 팁과 예제

by P_eli 2024. 10. 1.
728x90
반응형

MySQL은 데이터베이스 관리에 널리 사용되며, 성능 최적화는 모든 데이터베이스 관리자(DBA)와 개발자에게 중요한 과제입니다. 이번 포스트에서는 실습 가능한 방법들을 통해 MySQL 쿼리 성능을 향상시키는 팁과 예제를 소개하겠습니다.

1. 데이터베이스 및 테이블 설정

먼저, 실습을 위해 사용할 데이터베이스와 테이블을 생성합니다.

-- users 테이블 생성
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- orders 테이블 생성
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    status VARCHAR(20),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 데이터 삽입
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com');

INSERT INTO orders (user_id, order_date, status) VALUES
(1, '2024-01-10', 'completed'),
(1, '2024-02-15', 'pending'),
(2, '2024-01-20', 'completed'),
(3, '2024-02-01', 'cancelled');

 

2. 인덱스 사용하기

인덱스를 사용하면 데이터 검색 속도를 향상시킬 수 있습니다. users 테이블의 email 컬럼에 인덱스를 추가해 보겠습니다.

-- 인덱스 생성
CREATE INDEX idx_users_email ON users(email);

 

이제 인덱스를 사용하여 이메일로 사용자를 검색해 보겠습니다.

-- 인덱스를 활용한 쿼리
SELECT * FROM users WHERE email = 'alice@example.com';

 

3. EXPLAIN 명령어 활용하기

EXPLAIN 명령어를 사용하여 쿼리의 실행 계획을 분석합니다. 이를 통해 성능 병목 현상을 확인할 수 있습니다.

EXPLAIN SELECT * FROM users WHERE email = 'alice@example.com';

 

실행 계획을 통해 인덱스가 사용되는지 확인하고, 쿼리를 최적화하는 데 도움을 줄 수 있습니다.

 

4. 쿼리 최적화하기

필요한 컬럼만 선택하여 쿼리를 최적화할 수 있습니다. 전체 데이터를 조회하는 대신, 특정 컬럼만 선택해보겠습니다.

-- 비효율적인 쿼리
SELECT * FROM orders WHERE status = 'completed';

-- 최적화된 쿼리
SELECT id, order_date FROM orders WHERE status = 'completed';

 

5. 조인 최적화하기

여러 테이블을 조인할 때는 조인의 순서를 최적화하고, 필요한 컬럼만 선택하도록 합니다.

-- 비효율적인 조인
SELECT o.id, o.order_date, u.name 
FROM orders o 
JOIN users u ON o.user_id = u.id;

-- 최적화된 조인
SELECT o.id, o.order_date 
FROM orders o 
WHERE o.status = 'completed';

 

6. 캐싱 사용하기

MySQL의 쿼리 캐싱 기능을 활성화하면 자주 조회되는 쿼리 결과를 저장하여 성능을 향상시킬 수 있습니다. MySQL 설정 파일(my.cnf)에서 query_cache_size를 설정하고, MySQL 서버를 재시작합니다.

[mysqld]
query_cache_type = 1
query_cache_size = 1048576  # 1MB

 

7. 데이터베이스 정규화 및 비정규화

데이터 정규화를 통해 중복 데이터를 줄일 수 있습니다. 하지만 비정규화가 필요한 경우도 있습니다. 다음은 비정규화를 통한 성능 향상의 예입니다.

비정규화 예시

사용자 정보가 주문 테이블에 포함되어 있다고 가정합니다.

-- 비정규화된 orders 테이블 예
CREATE TABLE orders_denormalized (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_name VARCHAR(100),
    user_email VARCHAR(100),
    order_date DATE,
    status VARCHAR(20)
);

 

이 테이블에서는 사용자 정보를 중복 저장하므로 조인 없이 빠르게 데이터를 조회할 수 있습니다.

결론

MySQL 쿼리 성능 향상은 다양한 기법을 통해 이루어질 수 있습니다. 위에서 설명한 방법들을 실습해보면서 성능을 개선해 보세요. 항상 최적화된 쿼리를 사용하고, 데이터베이스를 정기적으로 점검하는 것이 중요합니다.

728x90
반응형