MySQL 임시 테이블: 작동 원리, 장점 및 모범 사례

目次

1. 소개

When working with MySQL, a “temporary table” is a useful way to store and process data temporarily. By using temporary tables, you can temporarily hold data to reduce the load of complex queries and improve the efficiency of batch processing.

MySQL을 사용할 때, “임시 테이블”은 데이터를 일시적으로 저장하고 처리하는 유용한 방법입니다. 임시 테이블을 사용하면 데이터를 일시적으로 보관하여 복잡한 쿼리의 부하를 줄이고 배치 처리의 효율성을 높일 수 있습니다.

In this article, we will explain what MySQL temporary tables are, along with their use cases and benefits in detail.

이 문서에서는 MySQL 임시 테이블이 무엇인지, 사용 사례와 장점에 대해 자세히 설명합니다.

임시 테이블이란?

A temporary table is a table that is valid only within a session.
Unlike regular tables, it is not stored permanently in the database, and it is automatically dropped when the session ends.

임시 테이블은 세션 내에서만 유효한 테이블입니다.
일반 테이블과 달리 데이터베이스에 영구적으로 저장되지 않으며, 세션이 종료될 때 자동으로 삭제됩니다.

The key characteristics of temporary tables are as follows:

임시 테이블의 주요 특징은 다음과 같습니다:

  • They exist per session (not accessible from other connections)
  • 세션당 존재합니다 (다른 연결에서는 접근할 수 없음)
  • They are automatically dropped when the session ends
  • 세션이 종료될 때 자동으로 삭제됩니다
  • They can be used without interfering even if a regular table with the same name exists
  • 동일한 이름의 일반 테이블이 존재해도 충돌 없이 사용할 수 있습니다
  • They are often used to improve performance
  • 성능 향상을 위해 자주 사용됩니다

Temporary tables are well-suited for data analysis and temporary data processing, and they are commonly used as support for batch processing and aggregation tasks.

임시 테이블은 데이터 분석 및 일시적인 데이터 처리에 적합하며, 배치 처리와 집계 작업을 지원하는 데 흔히 사용됩니다.

임시 테이블 사용의 장점

Using temporary tables can make data processing more efficient. Here are three major benefits.

임시 테이블을 사용하면 데이터 처리를 보다 효율적으로 할 수 있습니다. 주요 장점 세 가지를 소개합니다.

1. 쿼리 성능 향상

When handling large amounts of data, using multiple JOINs and subqueries can make processing complex and increase database load. With temporary tables, you can filter and store data in advance, speeding up query execution.

대량 데이터를 처리할 때 여러 JOIN 및 서브쿼리를 사용하면 처리 과정이 복잡해지고 데이터베이스 부하가 증가합니다. 임시 테이블을 사용하면 데이터를 미리 필터링하고 저장하여 쿼리 실행 속도를 높일 수 있습니다.

2. 임시 데이터 저장에 이상적

In batch processing or data transformation, you may need to store data temporarily and perform necessary operations. Temporary tables let you store data temporarily and enable fast in-memory processing.

배치 처리나 데이터 변환 시 데이터를 일시적으로 저장하고 필요한 작업을 수행해야 할 때가 있습니다. 임시 테이블을 사용하면 데이터를 일시적으로 저장하고 빠른 메모리 내 처리를 할 수 있습니다.

3. 기존 데이터 보호

Directly manipulating production data is risky. By using temporary tables, you can process data without changing production data and reduce the risk of errors.

실제 운영 데이터를 직접 조작하는 것은 위험합니다. 임시 테이블을 사용하면 운영 데이터를 변경하지 않고 데이터를 처리하여 오류 위험을 줄일 수 있습니다.

요약

MySQL temporary tables are a convenient tool for temporary data storage and processing.

MySQL 임시 테이블은 임시 데이터 저장 및 처리를 위한 편리한 도구입니다.

  • They are session-scoped and dropped when the session ends
  • 세션 범위이며 세션 종료 시 삭제됩니다
  • They are useful for performance improvements and batch processing
  • 성능 향상 및 배치 처리에 유용합니다
  • They allow safe operations without changing production data
  • 운영 데이터를 변경하지 않고 안전한 작업을 수행할 수 있습니다

2. 임시 테이블 기본

MySQL temporary tables are used to store data temporarily, unlike regular tables. In this section, we will explain the basic concepts of temporary tables in detail, including “differences from regular tables” and “differences from internal temporary tables.”

MySQL 임시 테이블은 일반 테이블과 달리 데이터를 일시적으로 저장하는 데 사용됩니다. 이 섹션에서는 “일반 테이블과의 차이점” 및 “내부 임시 테이블과의 차이점”을 포함한 임시 테이블의 기본 개념을 자세히 설명합니다.

임시 테이블과 일반 테이블의 차이점

Temporary tables and regular tables differ significantly in data retention and access behavior. The table below summarizes the main differences.

임시 테이블과 일반 테이블은 데이터 보존 및 접근 동작에서 크게 다릅니다. 아래 표는 주요 차이점을 요약합니다.

ItemTemporary TableRegular Table
LifetimeDropped when the session endsExists until explicitly dropped
AccessAvailable only within the session (not visible to other connections)Shareable across all sessions
ConflictsCan be used even if a regular table with the same name existsCannot create another table with the same name
Storage locationMEMORY (default) or an InnoDB temporary areaStored in the database storage
PersistenceNone (dropped when the session ends)Yes (retained by the database)

핵심 포인트

  • Temporary tables are isolated per session and are not visible to other users.
  • 임시 테이블은 세션당 격리되어 있으며 다른 사용자에게 보이지 않습니다.
  • You can create them without error even if a regular table with the same name exists .
  • 동일한 이름의 일반 테이블이 존재해도 오류 없이 생성할 수 있습니다.
  • They are created explicitly using CREATE TEMPORARY TABLE and are automatically dropped when the session ends .
  • CREATE TEMPORARY TABLE을 사용해 명시적으로 생성되며 세션이 종료될 때 자동으로 삭제됩니다.

임시 테이블과 내부 임시 테이블의 차이점

In addition to user-created temporary tables, MySQL also creates internal temporary tables automatically. They may sound similar, but their purposes and management differ.

사용자 생성 임시 테이블 외에도 MySQL은 내부 임시 테이블을 자동으로 생성합니다. 이름이 비슷해 보이지만 목적과 관리 방식이 다릅니다.

ItemTemporary TableInternal Temporary Table
Creation methodExplicitly created using CREATE TEMPORARY TABLEAutomatically created by MySQL
PurposeCreated by the user for specific processingCreated by MySQL to process complex queries (GROUP BY, ORDER BY)
ScopeAvailable only within the sessionValid only while the query is executing
DeletionDropped when the session endsAutomatically dropped after the query completes

내부 임시 테이블이란?

  • MySQL may internally create temporary tables to optimize certain queries (such as GROUP BY , ORDER BY , DISTINCT ).
  • MySQL은 특정 쿼리(GROUP BY, ORDER BY, DISTINCT 등)를 최적화하기 위해 내부적으로 임시 테이블을 생성할 수 있습니다.
  • End users cannot manage them directly (you cannot explicitly create them like CREATE TEMPORARY TABLE ).
  • 최종 사용자는 이를 직접 관리할 수 없습니다(CREATE TEMPORARY TABLE처럼 명시적으로 생성할 수 없음).
  • They are created as needed during query execution and are automatically dropped when the query completes .
  • 쿼리 실행 중 필요에 따라 생성되며 쿼리가 완료되면 자동으로 삭제됩니다.

내부 임시 테이블을 유발할 수 있는 예시

When you run a query like the following, MySQL may create an internal temporary table to process it.

다음과 같은 쿼리를 실행하면 MySQL이 내부 임시 테이블을 생성하여 처리할 수 있습니다.

SELECT category, COUNT(*) 
FROM products 
GROUP BY category
ORDER BY COUNT(*) DESC;

이 경우 MySQL은 GROUP BY 결과를 일시적으로 저장하기 위한 내부 임시 테이블을 생성하고,
이를 사용하여 최종 출력을 계산할 수 있습니다.

요약

  • 임시 테이블은 사용자가 만든 임시 테이블이며 세션이 종료될 때 자동으로 삭제됩니다.
  • 일반 테이블과 달리, 다른 세션에서는 접근할 수 없습니다.
  • 내부 임시 테이블은 MySQL에 의해 자동으로 생성 및 삭제되며, 사용자가 직접 제어할 수 없습니다.

3. 임시 테이블 생성 방법

CREATE TEMPORARY TABLE 문을 사용하여 MySQL 임시 테이블을 생성할 수 있습니다. 이 섹션에서는 기본 생성부터 기존 테이블을 기반으로 하는 생성까지 모든 내용을 설명합니다.

임시 테이블을 생성하는 기본 방법

MySQL에서는 CREATE TEMPORARY TABLE을 사용하여 임시 테이블을 생성합니다.

기본 구문

CREATE TEMPORARY TABLE table_name (
    column_name data_type constraints,
    column_name data_type constraints,
    ...
);

샘플 코드

다음 SQL은 users_temp라는 이름의 임시 테이블을 생성하며, 세 개의 컬럼 id(정수), name(문자열), email(문자열)을 포함합니다.

CREATE TEMPORARY TABLE users_temp (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

이 테이블은 세션이 종료될 때 자동으로 삭제되므로, 지속적인 데이터베이스에 영향을 주지 않습니다.

기존 테이블을 기반으로 임시 테이블 생성

처음부터 임시 테이블을 만드는 대신, 기존 테이블 구조를 복사하여 생성할 수도 있습니다.

CREATE TEMPORARY TABLE ... SELECT 사용

MySQL에서는 SELECT 문 결과를 기반으로 임시 테이블을 생성할 수 있습니다.

기본 구문

CREATE TEMPORARY TABLE temp_table_name
SELECT * FROM existing_table_name;

샘플 코드

예를 들어, users 테이블의 데이터 구조를 복사하여 새로운 임시 테이블 users_temp를 만들려면 다음과 같이 작성할 수 있습니다:

CREATE TEMPORARY TABLE users_temp
SELECT * FROM users;

이 방법으로 users의 컬럼 구조가 users_temp에 전달되지만, PRIMARY KEYINDEX와 같은 제약 조건은 복사되지 않습니다.

데이터를 포함하지 않고 테이블 구조만 복사하려면 WHERE 1=0을 추가합니다.

CREATE TEMPORARY TABLE users_temp
SELECT * FROM users WHERE 1=0;

이 SQL을 사용하면 users의 컬럼 정의가 복사되지만 데이터는 포함되지 않습니다.

임시 테이블 생성 시 주의 사항

1. 임시 테이블은 세션 범위

  • 임시 테이블은 생성된 세션 내에서만 유효합니다.
  • 다른 연결이나 다른 사용자에서는 접근할 수 없습니다.

2. 동일한 이름의 일반 테이블이 존재해도 생성 가능

  • 예를 들어, 데이터베이스에 users라는 일반 테이블이 존재하더라도 users라는 임시 테이블을 생성할 수 있습니다.
  • 해당 세션에서는 임시 테이블이 우선권을 가지며 일반 테이블은 숨겨집니다.

3. 스토리지 엔진 영향

  • 기본적으로 임시 테이블은 MEMORY 엔진을 사용하지만, 데이터 크기가 크면 InnoDB 임시 영역에 저장될 수 있습니다.
  • MEMORY 엔진을 명시적으로 지정하려면 다음과 같이 작성합니다: CREATE TEMPORARY TABLE users_temp ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ) ENGINE=MEMORY;
  • MEMORY 엔진은 빠르지만 데이터 크기 제한이 있습니다. 대용량 데이터셋의 경우 InnoDB 사용을 고려하십시오.

요약

  • CREATE TEMPORARY TABLE을 사용하여 임시 테이블을 생성합니다.
  • 기존 테이블을 복사하여 생성할 수도 있습니다 (SELECT * FROM).
  • MEMORY 엔진은 빠를 수 있지만, 대용량 데이터셋에는 InnoDB가 더 적합한 경우가 많습니다.
  • 임시 테이블은 세션별로 관리되며 세션이 종료될 때 자동으로 삭제됩니다.

4. 임시 테이블 사용 방법

MySQL 임시 테이블은 일반 테이블처럼 INSERT, UPDATE, DELETE, 그리고 SELECT 를 포함하여 작동할 수 있습니다. 이 섹션에서는 각 작업을 자세히 설명합니다.

Inserting data

임시 테이블에 데이터를 추가하려면 일반 INSERT INTO 문을 사용합니다.

Basic syntax

INSERT INTO temp_table_name (column1, column2, ...)
VALUES (value1, value2, ...);

Sample code

다음 SQL은 users_temp 라는 임시 테이블에 데이터를 삽입합니다.

INSERT INTO users_temp (id, name, email)
VALUES (1, 'Taro Yamada', 'taro@example.com');

기존 테이블에서 데이터를 복사하여 삽입할 수도 있습니다.

INSERT INTO users_temp (id, name, email)
SELECT id, name, email FROM users WHERE age >= 18;

이 SQL은 users 테이블에서 18세 이상인 사용자 데이터를 임시 테이블에 삽입합니다.

Updating data

임시 테이블의 데이터를 수정하려면 일반 UPDATE 문을 사용합니다.

Basic syntax

UPDATE temp_table_name
SET column_name = new_value
WHERE condition;

Sample code

예를 들어, users_temp 테이블에서 id=1 인 사용자의 이름을 변경하려면:

UPDATE users_temp
SET name = 'Ichiro Sato'
WHERE id = 1;

Deleting data

불필요한 데이터를 삭제하려면 DELETE 문을 사용합니다.

Basic syntax

DELETE FROM temp_table_name WHERE condition;

Sample code

예를 들어, users_temp 테이블에서 id=1 인 행을 삭제하려면:

DELETE FROM users_temp WHERE id = 1;

테이블의 전체 데이터를 삭제하려면 WHERE 절을 생략합니다.

DELETE FROM users_temp;

DELETE 를 사용해도 테이블 자체가 삭제되는 것이 아니라 데이터만 삭제된다는 점에 유의하십시오.

Selecting data

임시 테이블에 저장된 데이터를 조회하려면 SELECT 문을 사용합니다.

Basic syntax

SELECT column_name FROM temp_table_name WHERE condition;

Sample code

예를 들어, users_temp 테이블의 모든 데이터를 조회하려면:

SELECT * FROM users_temp;

특정 조건에 맞는 데이터를 조회하려면 WHERE 절을 사용합니다.

SELECT * FROM users_temp WHERE email LIKE '%@example.com';

이 SQL은 이메일 주소에 @example.com 이 포함된 행만 조회합니다.

Notes when using temporary tables

1. Data is removed when the session ends

  • 임시 테이블은 세션당 관리되며, 세션이 종료될 때 데이터도 함께 삭제 됩니다.
  • 장시간 실행되는 처리의 경우, 데이터를 주기적으로 백업 하는 것이 권장됩니다.

2. Creating a temporary table with the same name causes an error

  • CREATE TEMPORARY TABLE 로 동일한 이름의 임시 테이블을 만들려고 하면 오류가 발생 합니다.
  • 오류 방지 방법 으로, 미리 DROP TEMPORARY TABLE IF EXISTS 를 실행합니다. DROP TEMPORARY TABLE IF EXISTS users_temp; CREATE TEMPORARY TABLE users_temp (...);

3. Storage engine constraints

  • 임시 테이블은 기본적으로 MEMORY 엔진을 사용하지만, 대용량 데이터셋은 자동으로 InnoDB 임시 영역에 저장될 수 있습니다.
  • 대용량 데이터셋의 경우, InnoDB 임시 테이블을 사용하는 것이 권장 됩니다.

Summary

  • 임시 테이블은 일반 테이블과 마찬가지로 INSERT, UPDATE, DELETE, 그리고 SELECT 를 수행할 수 있습니다.
  • 세션이 종료되면 임시 테이블의 데이터도 자동으로 삭제 됩니다.
  • 미리 DROP TEMPORARY TABLE IF EXISTS 를 실행하면 이름 충돌 오류를 방지할 수 있습니다.
  • 대용량 데이터셋의 경우, InnoDB 임시 테이블을 사용하는 것이 권장 됩니다.

5. Managing and Dropping Temporary Tables

MySQL 임시 테이블은 세션이 종료될 때 자동으로 삭제됩니다. 그러나 경우에 따라 명시적으로 삭제해야 할 수도 있습니다. 이 섹션에서는 임시 테이블을 관리하고 삭제하는 방법을 설명합니다.

How to drop a temporary table

임시 테이블을 명시적으로 삭제하려면 DROP TEMPORARY TABLE 문을 사용합니다.

Basic syntax

DROP TEMPORARY TABLE table_name;

예를 들어, users_temp라는 임시 테이블을 삭제하려면 다음을 실행합니다:

DROP TEMPORARY TABLE users_temp;

이 SQL을 실행하면 users_temp 테이블이 삭제되어 세션에서 더 이상 사용할 수 없습니다.

세션 종료 시 자동 삭제

임시 테이블은 세션이 종료될 때 자동으로 삭제됩니다.

자동 삭제 작동 방식

  1. CREATE TEMPORARY TABLE 로 임시 테이블을 생성합니다
  2. 세션이 활성화된 동안 해당 데이터에 작업합니다
  3. 세션(연결)이 종료되면 임시 테이블이 자동으로 삭제됩니다

하지만 다음 경우에는 주의가 필요합니다:

  • 세션이 장시간 열려 있는 경우 → 불필요한 임시 테이블이 메모리를 차지할 수 있으므로 필요에 따라 DROP TEMPORARY TABLE을 실행하는 것이 권장됩니다.
  • 대량 데이터를 처리하는 경우 → 저장소 압박을 피하기 위해 테이블을 적절히 삭제하는 것이 중요합니다.

DROP TEMPORARY TABLE IF EXISTS 사용

존재하지 않을 수 있는 테이블을 삭제할 때 오류를 방지하려면 IF EXISTS를 사용할 수 있습니다.

기본 구문

DROP TEMPORARY TABLE IF EXISTS table_name;

샘플 코드

DROP TEMPORARY TABLE IF EXISTS users_temp;

이 SQL은 users_temp가 존재하면 삭제하고, 존재하지 않으면 오류를 발생시키지 않습니다.

일반적인 오류 및 해결 방법

오류 1: “Table not found”(테이블을 찾을 수 없음)

발생 상황:

  • DROP TEMPORARY TABLE을 사용해 존재하지 않는 테이블을 삭제하려 할 때
  • 임시 테이블은 세션 범위이므로 다른 세션에서 삭제할 수 없습니다

해결 방법:

  • 오류를 방지하려면 IF EXISTS를 추가합니다
    DROP TEMPORARY TABLE IF EXISTS users_temp;
    
  • 올바른 세션 내에서 삭제합니다

오류 2: “Table already exists”(테이블이 이미 존재함)

발생 상황:

  • 이미 존재하는 이름으로 임시 테이블을 생성하려 할 때

해결 방법:

  • 사전에 DROP TEMPORARY TABLE IF EXISTS를 실행합니다
    DROP TEMPORARY TABLE IF EXISTS users_temp;
    CREATE TEMPORARY TABLE users_temp (
        id INT PRIMARY KEY,
        name VARCHAR(50),
        email VARCHAR(100)
    );
    

임시 테이블 관리 모범 사례

  1. 더 이상 필요하지 않을 때 명시적으로 삭제합니다
    * 필요에 따라 DROP TEMPORARY TABLE을 실행해 불필요한 테이블을 해제합니다.

  2. 오류 방지를 위해 IF EXISTS를 사용합니다
    * DROP TEMPORARY TABLE IF EXISTS는 존재하지 않는 테이블을 삭제할 때 오류를 방지합니다.

  3. 세션 관리에 유의합니다
    * 장시간 지속되는 세션은 임시 테이블이 메모리를 차지하게 하므로 적절히 삭제합니다.

  4. 스토리지 엔진 영향을 이해합니다
    * MEMORY 엔진은 빠르지만 데이터 크기 제한이 있습니다.
    * InnoDB를 사용할 경우 디스크 공간 사용을 고려해야 합니다.

요약

  • DROP TEMPORARY TABLE을 사용해 임시 테이블을 명시적으로 삭제할 수 있습니다.
  • 세션이 종료될 때 자동으로 삭제되지만, 장시간 세션에서는 수동 정리가 권장됩니다.
  • DROP TEMPORARY TABLE IF EXISTS는 삭제 시 오류를 방지하는 데 도움이 됩니다.
  • “Table not found”(테이블을 찾을 수 없음)와 “Table already exists”(테이블이 이미 존재함) 오류를 처리하는 방법을 아는 것이 유용합니다.

6. 임시 테이블의 실용적인 사용 사례

MySQL 임시 테이블은 임시 데이터 저장 및 처리를 보다 효율적으로 만들기 위해 사용됩니다. 이 섹션에서는 임시 테이블이 유용한 일반적인 시나리오를 소개하고 구현 세부 사항을 설명합니다.

1. 집계용 중간 테이블로 사용

데이터 분석 및 보고서 생성 시, 대용량 데이터셋을 직접 처리하면 쿼리 실행이 느려질 수 있습니다. 임시 테이블을 사용하면 먼저 데이터를 정리한 뒤 처리함으로써 성능을 향상시킬 수 있습니다.

시나리오

  • sales 테이블에는 1년치 판매 데이터가 들어 있습니다.
  • 월별 총 판매액을 계산하고 추가 분석을 수행하고자 합니다.

구현 예시

CREATE TEMPORARY TABLE monthly_sales (
    month_year DATE,
    total_sales DECIMAL(10,2)
);

INSERT INTO monthly_sales (month_year, total_sales)
SELECT DATE_FORMAT(sale_date, '%Y-%m-01') AS month_year, SUM(amount) 
FROM sales
GROUP BY month_year;

SELECT * FROM monthly_sales;

2. Keeping temporary data for batch processing

Temporary tables are also useful for batch processing (bulk operations). For example, you can filter data by certain conditions and store only the target data in a temporary table to operate efficiently.

Scenario

  • From the users table, you want to email only users who have logged in within the last year .
  • You store the target data in a temporary table first, then process it sequentially.

Example implementation

CREATE TEMPORARY TABLE active_users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(255)
);

INSERT INTO active_users
SELECT id, name, email FROM users WHERE last_login >= NOW() - INTERVAL 1 YEAR;

SELECT * FROM active_users;

3. Simplifying complex queries

Running complex queries directly can reduce performance and hurt readability. By using temporary tables, you can reduce subqueries and keep SQL simpler.

Scenario

  • You want to get the top 10 best-selling products from the orders table.
  • You want to avoid using subqueries by leveraging a temporary table.

Example implementation

CREATE TEMPORARY TABLE top_products AS
SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;

SELECT * FROM top_products;

4. Temporary operations without needing rollback

Temporary tables are managed per session and are not affected by transactions. This makes them suitable for managing temporary data where rollback is not desired.

Scenario

  • During a transaction, you want to keep temporary calculation results .
  • But you want to avoid temporary data being rolled back on errors.

Example implementation

START TRANSACTION;

CREATE TEMPORARY TABLE temp_results (
    user_id INT,
    score INT
);

INSERT INTO temp_results
SELECT user_id, SUM(points) FROM game_scores GROUP BY user_id;

-- Commit the transaction
COMMIT;

SELECT * FROM temp_results;

Summary

  • Temporary tables can be used for aggregation, batch processing, and simplifying queries across many scenarios.
  • Using them as an intermediate table can improve performance and help organize data.
  • For batch processing , pre-extracting only target data helps avoid unnecessary work.
  • For simplifying complex queries , reducing subqueries improves readability.
  • Because they are not affected by transactions , they can be used for temporary data where rollback is not needed.

7. Alternatives and Limitations of Temporary Tables

MySQL temporary tables are useful, but they have some limitations. In some cases, using alternatives such as views or subqueries can provide more efficient data processing. In this section, we explain the main limitations of temporary tables and alternative approaches to work around them.

Main limitations of temporary tables

Temporary tables have several limitations that regular tables do not. Understanding these helps you choose appropriate use cases.

1. Session-scoped

  • A temporary table is valid only within the session where it was created, and cannot be accessed by other connections or users .
  • Even if a regular table with the same name exists, the temporary table takes precedence within the session (the regular table is not accessible).

2. The schema is not retained

  • Regular tables can be inspected with SHOW CREATE TABLE , but a temporary table disappears when the session ends , so its schema is not retained.

3. Index limitations

  • CREATE TEMPORARY TABLE 에서 PRIMARY KEY 또는 INDEX 를 지정하지 않으면 자동으로 생성되지 않습니다.
  • 임시 테이블에 인덱스가 필요하면 직접 생성해야 합니다.

4. 기본 스토리지 엔진은 MEMORY

  • MEMORY 엔진을 사용하면 대용량 데이터가 디스크 스와핑을 일으켜 성능이 저하될 수 있습니다.
  • InnoDB 를 지정하면 더 큰 데이터를 처리할 수 있지만 디스크 사용량이 증가합니다.

5. 트랜잭션의 영향을 받지 않음

  • 임시 테이블은 ROLLBACK 의 영향을 받지 않습니다.
  • 따라서 엄격한 트랜잭션 일관성이 필요한 처리에는 적합하지 않습니다.

임시 테이블 대안

이러한 제한을 피하려면 뷰(view) 또는 서브쿼리 를 사용하여 임시 테이블 대신 보다 유연하게 데이터를 처리할 수 있습니다.

1. 뷰 사용

뷰는 임시 데이터를 참조하는 데 있어 임시 테이블과 유사하게 사용할 수 있습니다. 뷰는 가상 테이블이며 임시 데이터 저장이 필요하지 않으므로 스토리지 제약을 피할 수 있습니다.

뷰 생성

CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE last_login >= NOW() - INTERVAL 1 YEAR;

뷰 사용

SELECT * FROM active_users;
뷰 사용의 장점

스토리지 사용 없음 (데이터를 직접 참조하므로 임시 저장이 필요하지 않음)
세션에 의존하지 않음 (다른 사용자와 연결에서도 사용 가능)
스키마를 유지할 수 있음 (SHOW CREATE VIEW 로 정의를 확인할 수 있음)

뷰 사용의 단점

업데이트가 어려움 (뷰에 대한 직접 INSERT 또는 UPDATE 가 제한됨)
대용량 데이터셋에서는 성능 저하 가능

2. 서브쿼리 사용

서브쿼리 를 사용하여 임시 테이블을 만들지 않고도 임시 데이터를 처리할 수 있습니다.

임시 테이블 사용

CREATE TEMPORARY TABLE top_products AS
SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;

SELECT * FROM top_products;

서브쿼리 사용

SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;
서브쿼리 사용의 장점

임시 테이블을 생성하지 않으므로 성능이 향상됨
스토리지 사용 없음
세션에 의존하지 않으며 언제든 실행 가능

서브쿼리 사용의 단점

복잡한 쿼리에서는 가독성이 떨어질 수 있음
데이터 재사용이 어려움 (같은 데이터를 반복해서 참조해야 할 수 있음)

3. CTE (WITH 절) 사용

MySQL 8.0 이상에서는 CTE (Common Table Expression) 를 사용하여 임시 테이블을 만들지 않고 데이터를 일시적으로 처리할 수 있습니다.

CTE 예시

WITH top_products AS (
    SELECT product_id, SUM(amount) AS total_sales
    FROM orders
    GROUP BY product_id
    ORDER BY total_sales DESC
    LIMIT 10
)
SELECT * FROM top_products;
CTE 사용의 장점

가독성 향상 (서브쿼리보다 읽기 쉬운 경우가 많음)
성능 최적화 가능 (임시 테이블을 만들지 않는 임시‑스타일 처리)

CTE 사용의 단점

MySQL 5.x에서는 사용 불가 (MySQL 8.0 이상에서만 지원)

요약

MethodProsCons
Temporary tableGood for session-scoped data processingConsumes storage and disappears when the session ends
ViewNo storage usage, not session-dependentHard to update, possible performance degradation
SubqueryNo storage usage, simpleHard to reuse, reduced readability
CTE (WITH)Better readability, performance optimizationAvailable only in MySQL 8.0+

8. FAQ

여기에는 MySQL 임시 테이블에 대한 자주 묻는 질문이 있습니다. 이 내용이 동작 방식과 제한 사항을 이해하는 데 도움이 되길 바랍니다.

1. 임시 테이블을 다른 세션에서 참조할 수 있나요?

아니요, 불가능합니다.
임시 테이블은 생성된 세션 내에서만 사용할 수 있습니다. 다른 세션에서는 접근할 수 없습니다. 다른 사용자가 같은 이름의 임시 테이블을 생성하더라도 각 세션은 이를 독립적인 테이블로 취급합니다.

2. 임시 테이블을 생성하려면 어떤 권한이 필요합니까?

임시 테이블을 만들려면 데이터베이스에 CREATE TEMPORARY TABLES 권한이 필요합니다.
사용자에게 권한을 부여하려면 다음 SQL을 실행하십시오:

GRANT CREATE TEMPORARY TABLES ON database_name.* TO 'user_name'@'host';

SHOW GRANTS를 사용하여 현재 권한을 확인할 수도 있습니다.

SHOW GRANTS FOR 'user_name'@'host';

3. 임시 테이블이 디스크 사용량에 영향을 미칩니까?

예, 영향을 줄 수 있습니다.
기본적으로 MySQL 임시 테이블은 MEMORY 엔진을 사용하지만, 데이터 크기가 일정 임계값을 초과하면 InnoDB 임시 영역에 저장됩니다.

대용량 데이터셋을 다룰 때 임시 테이블이 디스크 공간을 차지할 수 있습니다. 따라서 더 이상 필요하지 않을 때 명시적으로 삭제하는 것이 권장됩니다.

DROP TEMPORARY TABLE IF EXISTS table_name;

디스크 영향을 최소화하려면 대용량 데이터를 예상할 경우 MEMORY 대신 InnoDB로 임시 테이블을 생성하는 것을 고려하십시오.

CREATE TEMPORARY TABLE table_name (
    column1 data_type,
    column2 data_type
) ENGINE=InnoDB;

4. 임시 테이블과 내부 임시 테이블의 차이점은 무엇입니까?

ItemTemporary tableInternal temporary table
Creation methodCreated by the user with CREATE TEMPORARY TABLEAutomatically created by MySQL during processing such as GROUP BY
ScopeOnly within the creating sessionOnly during query execution
DeletionExplicitly dropped with DROP TEMPORARY TABLEAutomatically dropped when the query completes

5. 임시 테이블을 스레드 간에 공유할 수 있습니까?

아니요, 공유할 수 없습니다.
임시 테이블은 생성된 스레드(세션) 내에서만 유효하며 다른 스레드나 프로세스에서는 접근할 수 없습니다.

세션/스레드 간에 데이터를 공유해야 한다면 대신 일반 테이블을 생성해야 합니다.

CREATE TABLE shared_temp_table (
    id INT PRIMARY KEY,
    data VARCHAR(255)
);

6. 임시 테이블이 성능을 저하시킬 수 있습니까?

예, 경우에 따라 그렇습니다.
특히 다음 상황에 주의하십시오:

  • 데이터 양이 너무 큰 경우
  • MEMORY 엔진에는 크기 제한이 있으며, 이를 초과하면 데이터가 InnoDB로 스와핑될 수 있어 성능이 저하될 수 있습니다.
  • 완화 방안: MEMORY 제한을 초과할 것으로 예상되면 처음부터 InnoDB로 테이블을 생성하십시오.
  • 적절한 인덱스가 설정되지 않은 경우
  • CREATE TEMPORARY TABLE ... SELECT 로 생성된 테이블은 인덱스를 복사하지 않으므로 검색이 느려질 수 있습니다.
  • 완화 방안: 필요에 따라 ALTER TABLE을 사용해 인덱스를 추가하십시오.
    ALTER TABLE temp_table_name ADD INDEX (column_name);
    

7. 임시 테이블 성능을 어떻게 향상시킬 수 있나요?

임시 테이블 성능을 향상시키기 위해 다음과 같은 방법이 효과적입니다:

MEMORY 엔진 사용 (소규모 데이터셋에 빠름)

CREATE TEMPORARY TABLE table_name (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) ENGINE=MEMORY;

필요한 컬럼만 선택 (불필요한 컬럼은 제외)

CREATE TEMPORARY TABLE users_temp AS
SELECT id, name FROM users;

적절한 인덱스 추가 (검색 속도 향상)

ALTER TABLE users_temp ADD INDEX (name);

더 이상 필요하지 않으면 즉시 삭제 (메모리 해제)

DROP TEMPORARY TABLE IF EXISTS users_temp;

요약

  • 임시 테이블은 다른 세션이나 스레드에서 참조할 수 없습니다
  • 임시 테이블을 만들려면 CREATE TEMPORARY TABLES 권한이 필요합니다
  • 데이터가 너무 커지면 MySQL이 MEMORY에서 InnoDB로 전환할 수 있으며, 이 경우 성능이 저하될 수 있습니다
  • 적절한 인덱스를 추가하면 쿼리 속도가 빨라집니다
  • 더 이상 필요하지 않을 때 DROP TEMPORARY TABLE로 임시 테이블을 삭제하는 것이 권장됩니다

이로써 MySQL 임시 테이블에 대한 기본 개념부터 사용 사례, 제한 사항, 대안 및 FAQ에 이르는 상세한 설명이 완료되었습니다.
임시 테이블을 적절히 사용하면 데이터 처리 효율성을 크게 향상시킬 수 있습니다.