- 1 1. Giới thiệu
- 2 2. Những kiến thức cơ bản về bảng tạm thời
- 3 3. Cách Tạo Bảng Tạm
- 4 4. Cách Sử Dụng Bảng Tạm
- 5 5. Managing and Dropping Temporary Tables
- 6 6. Practical Use Cases for Temporary Tables
- 7 7. Alternatives and Limitations of Temporary Tables
- 8 8. Câu hỏi thường gặp
- 8.1 1. Bảng tạm có thể được tham chiếu từ các phiên khác không?
- 8.2 2. Cần những quyền nào để tạo bảng tạm?
- 8.3 3. Các bảng tạm có ảnh hưởng đến việc sử dụng đĩa không?
- 8.4 4. Sự khác nhau giữa bảng tạm và bảng tạm nội bộ là gì?
- 8.5 5. Các bảng tạm có thể được chia sẻ giữa các luồng không?
- 8.6 6. Các bảng tạm có thể làm giảm hiệu năng không?
- 8.7 7. Làm thế nào để cải thiện hiệu năng của bảng tạm?
- 8.8 Tóm tắt
1. Giới thiệu
Khi làm việc với MySQL, “bảng tạm thời” là một cách hữu ích để lưu trữ và xử lý dữ liệu một cách tạm thời. Bằng cách sử dụng các bảng tạm thời, bạn có thể giữ dữ liệu tạm thời để giảm tải cho các truy vấn phức tạp và cải thiện hiệu suất của việc xử lý hàng loạt.
Trong bài viết này, chúng tôi sẽ giải thích bảng tạm thời của MySQL là gì, cùng với các trường hợp sử dụng và lợi ích chi tiết.
Bảng tạm thời là gì?
Bảng tạm thời là bảng chỉ có hiệu lực trong một phiên làm việc.
Không giống như các bảng thường, nó không được lưu trữ vĩnh viễn trong cơ sở dữ liệu và tự động bị xóa khi phiên làm việc kết thúc.
Các đặc điểm chính của bảng tạm thời như sau:
- Chúng tồn tại riêng cho mỗi phiên (không thể truy cập từ các kết nối khác)
- Chúng tự động bị xóa khi phiên kết thúc
- Có thể được sử dụng mà không gây xung đột ngay cả khi đã tồn tại một bảng thường cùng tên
- Chúng thường được dùng để cải thiện hiệu năng
Bảng tạm thời rất phù hợp cho việc phân tích dữ liệu và xử lý dữ liệu tạm thời, và chúng thường được dùng như hỗ trợ cho các tác vụ xử lý hàng loạt và tổng hợp.
Lợi ích khi sử dụng bảng tạm thời
Việc sử dụng bảng tạm thời có thể làm cho quá trình xử lý dữ liệu hiệu quả hơn. Dưới đây là ba lợi ích chính.
1. Cải thiện hiệu năng truy vấn
Khi xử lý một lượng lớn dữ liệu, việc sử dụng nhiều JOIN và các truy vấn con có thể làm cho quá trình trở nên phức tạp và tăng tải cho cơ sở dữ liệu. Với bảng tạm thời, bạn có thể lọc và lưu trữ dữ liệu trước, giúp tăng tốc thực thi truy vấn.
2. Lý tưởng cho việc lưu trữ dữ liệu tạm thời
Trong xử lý hàng loạt hoặc chuyển đổi dữ liệu, bạn có thể cần lưu trữ dữ liệu tạm thời và thực hiện các thao tác cần thiết. Bảng tạm thời cho phép bạn lưu trữ dữ liệu tạm thời và hỗ trợ xử lý nhanh trong bộ nhớ.
3. Bảo vệ dữ liệu hiện có
Việc thao tác trực tiếp trên dữ liệu sản xuất là rủi ro. Bằng cách sử dụng bảng tạm thời, bạn có thể xử lý dữ liệu mà không làm thay đổi dữ liệu sản xuất và giảm nguy cơ lỗi.
Tóm tắt
Bảng tạm thời của MySQL là một công cụ tiện lợi cho việc lưu trữ và xử lý dữ liệu tạm thời.
- Chúng có phạm vi theo phiên và bị xóa khi phiên kết thúc
- Chúng hữu ích cho việc cải thiện hiệu năng và xử lý hàng loạt
- Chúng cho phép thực hiện các thao tác an toàn mà không thay đổi dữ liệu sản xuất
2. Những kiến thức cơ bản về bảng tạm thời
Bảng tạm thời của MySQL được dùng để lưu trữ dữ liệu tạm thời, khác với các bảng thường. Trong phần này, chúng tôi sẽ giải thích chi tiết các khái niệm cơ bản của bảng tạm thời, bao gồm “sự khác biệt so với bảng thường” và “sự khác biệt so với bảng tạm thời nội bộ”.
Sự khác biệt giữa bảng tạm thời và bảng thường
Bảng tạm thời và bảng thường có sự khác biệt đáng kể về việc giữ lại dữ liệu và hành vi truy cập. Bảng dưới đây tóm tắt các khác biệt chính.
| Item | Temporary Table | Regular Table |
|---|---|---|
| Lifetime | Dropped when the session ends | Exists until explicitly dropped |
| Access | Available only within the session (not visible to other connections) | Shareable across all sessions |
| Conflicts | Can be used even if a regular table with the same name exists | Cannot create another table with the same name |
| Storage location | MEMORY (default) or an InnoDB temporary area | Stored in the database storage |
| Persistence | None (dropped when the session ends) | Yes (retained by the database) |
Các điểm chính
- Bảng tạm thời được cô lập theo từng phiên và không hiển thị với người dùng khác.
- Bạn có thể tạo chúng mà không gặp lỗi ngay cả khi đã tồn tại một bảng thường cùng tên.
- Chúng được tạo một cách rõ ràng bằng
CREATE TEMPORARY TABLEvà tự động bị xóa khi phiên kết thúc.
Sự khác biệt giữa bảng tạm thời và bảng tạm thời nội bộ
Ngoài các bảng tạm thời do người dùng tạo, MySQL cũng tự động tạo bảng tạm thời nội bộ. Chúng có thể nghe có vẻ giống nhau, nhưng mục đích và cách quản lý lại khác nhau.
| Item | Temporary Table | Internal Temporary Table |
|---|---|---|
| Creation method | Explicitly created using CREATE TEMPORARY TABLE | Automatically created by MySQL |
| Purpose | Created by the user for specific processing | Created by MySQL to process complex queries (GROUP BY, ORDER BY) |
| Scope | Available only within the session | Valid only while the query is executing |
| Deletion | Dropped when the session ends | Automatically dropped after the query completes |
Bảng tạm thời nội bộ là gì?
- MySQL có thể tự động tạo các bảng tạm thời nội bộ để tối ưu một số truy vấn (như
GROUP BY,ORDER BY,DISTINCT). - Người dùng cuối không thể quản lý chúng trực tiếp (bạn không thể tạo chúng một cách rõ ràng như
CREATE TEMPORARY TABLE). - Chúng được tạo khi cần trong quá trình thực thi truy vấn và tự động bị xóa khi truy vấn hoàn thành.
Ví dụ có thể kích hoạt bảng tạm thời nội bộ
Khi bạn chạy một truy vấn như sau, MySQL có thể tạo một bảng tạm thời nội bộ để xử lý nó.
SELECT category, COUNT(*)
FROM products
GROUP BY category
ORDER BY COUNT(*) DESC;
Trong trường hợp này, MySQL có thể tạo một bảng tạm nội bộ để tạm thời lưu trữ kết quả GROUP BY,
và sau đó sử dụng nó để tính toán kết quả cuối cùng.
Summary
- Bảng tạm là một bảng tạm do người dùng tạo và sẽ tự động bị xóa khi phiên làm việc kết thúc.
- Khác với các bảng thường, nó không thể được truy cập từ các phiên khác.
- Bảng tạm nội bộ được MySQL tạo và xóa tự động, và người dùng không thể kiểm soát nó một cách trực tiếp.

3. Cách Tạo Bảng Tạm
Bạn có thể tạo một bảng tạm MySQL bằng câu lệnh CREATE TEMPORARY TABLE. Trong phần này, chúng tôi sẽ giải thích mọi thứ từ việc tạo cơ bản đến việc tạo một bảng dựa trên một bảng hiện có.
Cách cơ bản để tạo một bảng tạm
Trong MySQL, bạn sử dụng CREATE TEMPORARY TABLE để tạo một bảng tạm.
Basic syntax
CREATE TEMPORARY TABLE table_name (
column_name data_type constraints,
column_name data_type constraints,
...
);
Sample code
SQL sau tạo một bảng tạm có tên users_temp với ba cột: id (số nguyên), name (chuỗi), và email (chuỗi).
CREATE TEMPORARY TABLE users_temp (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
Vì bảng này được tự động xóa khi phiên kết thúc, nó không ảnh hưởng đến cơ sở dữ liệu lâu dài.
Tạo một bảng tạm dựa trên một bảng hiện có
Thay vì tạo một bảng tạm từ đầu, bạn cũng có thể sao chép cấu trúc của một bảng hiện có để tạo ra một bảng.
Using CREATE TEMPORARY TABLE ... SELECT
Trong MySQL, bạn có thể tạo một bảng tạm dựa trên kết quả của một câu lệnh SELECT.
Basic syntax
CREATE TEMPORARY TABLE temp_table_name
SELECT * FROM existing_table_name;
Sample code
Ví dụ, để sao chép cấu trúc dữ liệu của bảng users và tạo một bảng tạm mới users_temp, bạn có thể viết:
CREATE TEMPORARY TABLE users_temp
SELECT * FROM users;
Với phương pháp này, cấu trúc cột của users được chuyển sang users_temp, nhưng các ràng buộc như PRIMARY KEY và INDEX không được sao chép.
Nếu bạn muốn sao chép chỉ cấu trúc bảng mà không bao gồm dữ liệu, hãy thêm WHERE 1=0.
CREATE TEMPORARY TABLE users_temp
SELECT * FROM users WHERE 1=0;
Với SQL này, các định nghĩa cột của users được sao chép, nhưng không có dữ liệu nào được bao gồm.
Lưu ý khi tạo bảng tạm
1. Temporary tables are session-scoped
- Bảng tạm chỉ hợp lệ trong phiên mà nó được tạo.
- Nó không thể được truy cập từ các kết nối khác hoặc bởi người dùng khác.
2. You can create it even if a regular table with the same name exists
- Ví dụ, ngay cả khi có một bảng thường có tên
userstrong cơ sở dữ liệu, bạn vẫn có thể tạo một bảng tạm có tênusers. - Trong phiên đó, bảng tạm sẽ có ưu tiên và bảng thường sẽ bị ẩn.
3. Storage engine impact
- Mặc định, các bảng tạm sử dụng engine
MEMORY, nhưng nếu kích thước dữ liệu lớn, chúng có thể được lưu trong khu vực tạm thời củaInnoDB. - Nếu bạn muốn chỉ định rõ ràng engine
MEMORY, viết như sau:CREATE TEMPORARY TABLE users_temp ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ) ENGINE=MEMORY; - Engine
MEMORYnhanh nhưng có giới hạn kích thước dữ liệu. Đối với các bộ dữ liệu lớn, hãy cân nhắc sử dụngInnoDB.
Summary
- Tạo bảng tạm bằng cách sử dụng
CREATE TEMPORARY TABLE. - Bạn cũng có thể tạo một bảng bằng cách sao chép một bảng hiện có (
SELECT * FROM). - Engine
MEMORYcó thể nhanh, nhưngInnoDBthường tốt hơn cho các bộ dữ liệu lớn. - Bảng tạm được quản lý theo từng phiên và tự động bị xóa khi phiên kết thúc.
4. Cách Sử Dụng Bảng Tạm
MySQL temporary tables can be operated like regular tables, including INSERT, UPDATE, DELETE, and SELECT. In this section, we explain each operation in detail.
Inserting data
To add data to a temporary table, use the regular INSERT INTO statement.
Basic syntax
INSERT INTO temp_table_name (column1, column2, ...)
VALUES (value1, value2, ...);
Sample code
The following SQL inserts data into a temporary table named users_temp.
INSERT INTO users_temp (id, name, email)
VALUES (1, 'Taro Yamada', 'taro@example.com');
You can also copy and insert data from an existing table.
INSERT INTO users_temp (id, name, email)
SELECT id, name, email FROM users WHERE age >= 18;
This SQL inserts data for users aged 18 or older from the users table into the temporary table.
Updating data
To modify data in a temporary table, use the regular UPDATE statement.
Basic syntax
UPDATE temp_table_name
SET column_name = new_value
WHERE condition;
Sample code
For example, to change the name of the user with id=1 in the users_temp table:
UPDATE users_temp
SET name = 'Ichiro Sato'
WHERE id = 1;
Deleting data
To delete unnecessary data, use the DELETE statement.
Basic syntax
DELETE FROM temp_table_name WHERE condition;
Sample code
For example, to delete the row with id=1 from users_temp:
DELETE FROM users_temp WHERE id = 1;
To delete all data in the table, omit the WHERE clause.
DELETE FROM users_temp;
Note that using DELETE does not drop the table itself; it deletes only the data.
Selecting data
To retrieve data stored in a temporary table, use the SELECT statement.
Basic syntax
SELECT column_name FROM temp_table_name WHERE condition;
Sample code
For example, to retrieve all data from users_temp:
SELECT * FROM users_temp;
To retrieve data matching a specific condition, use the WHERE clause.
SELECT * FROM users_temp WHERE email LIKE '%@example.com';
This SQL retrieves only rows where the email address contains @example.com.
Notes when using temporary tables
1. Data is removed when the session ends
- Temporary tables are managed per session, and their data is also removed when the session ends.
- For long-running processing, it is recommended to back up data periodically.
2. Creating a temporary table with the same name causes an error
- If you try to create a temporary table with the same name using
CREATE TEMPORARY TABLE, an error occurs. - As an error avoidance approach, run
DROP TEMPORARY TABLE IF EXISTSbeforehand.DROP TEMPORARY TABLE IF EXISTS users_temp; CREATE TEMPORARY TABLE users_temp (...);
3. Storage engine constraints
- Temporary tables default to the
MEMORYengine, but large datasets may be automatically stored in anInnoDBtemporary area. - For large datasets, using an
InnoDBtemporary table is recommended.
Summary
- Temporary tables can perform INSERT, UPDATE, DELETE, and SELECT just like regular tables.
- When the session ends, data in the temporary table is also automatically removed.
- Running
DROP TEMPORARY TABLE IF EXISTSbeforehand helps avoid name-conflict errors. - For large datasets, using an
InnoDBtemporary table is recommended.
5. Managing and Dropping Temporary Tables
MySQL temporary tables are automatically dropped when the session ends. However, in some cases you may need to drop them explicitly. In this section, we explain how to manage and drop temporary tables.
How to drop a temporary table
To explicitly drop a temporary table, use the DROP TEMPORARY TABLE statement.
Basic syntax
DROP TEMPORARY TABLE table_name;
Sample code
For example, to drop a temporary table named users_temp, run:
DROP TEMPORARY TABLE users_temp;
After running this SQL, the users_temp table is removed and can no longer be used in the session.
Automatic drop when the session ends
A temporary table is automatically dropped when the session ends.
How automatic drop works
- Create a temporary table with
CREATE TEMPORARY TABLE - Operate on its data while the session is active
- When the session (connection) is closed, the temporary table is automatically dropped
However, be careful in the following cases:
- When sessions remain open for a long time → Unnecessary temporary tables may consume memory, so it is recommended to run
DROP TEMPORARY TABLEas needed. - When handling large amounts of data → To avoid storage pressure, it is important to drop tables appropriately.
Using DROP TEMPORARY TABLE IF EXISTS
To avoid errors when dropping a table that may not exist, you can use IF EXISTS.
Basic syntax
DROP TEMPORARY TABLE IF EXISTS table_name;
Sample code
DROP TEMPORARY TABLE IF EXISTS users_temp;
This SQL drops users_temp if it exists; if it does not exist, it will not raise an error.
Common errors and fixes
Error 1: “Table not found”
When it happens:
- When you try to drop a table that does not exist using
DROP TEMPORARY TABLE - Because temporary tables are session-scoped, you cannot drop them from a different session
Fix:
- Add
IF EXISTSto avoid the errorDROP TEMPORARY TABLE IF EXISTS users_temp;
- Drop it within the correct session
Error 2: “Table already exists”
When it happens:
- When you try to create a temporary table with a name that already exists
Fix:
- Run
DROP TEMPORARY TABLE IF EXISTSbeforehandDROP TEMPORARY TABLE IF EXISTS users_temp; CREATE TEMPORARY TABLE users_temp ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) );
Best practices for managing temporary tables
- Drop them explicitly when you no longer need them
- Run
DROP TEMPORARY TABLEas needed to free unnecessary tables.
- Use
IF EXISTSto avoid errors
DROP TEMPORARY TABLE IF EXISTSprevents errors when dropping a table that does not exist.
- Be mindful of session management
- Long-lived sessions can cause temporary tables to consume memory, so drop them as appropriate.
- Understand storage engine impact
- The
MEMORYengine is fast but has data size limits. - If you use
InnoDB, you need to consider disk space usage.
Summary
- You can explicitly drop temporary tables using
DROP TEMPORARY TABLE. - They are automatically dropped when the session ends, but for long-lived sessions, manual cleanup is recommended.
DROP TEMPORARY TABLE IF EXISTShelps prevent errors when dropping.- It is useful to know how to handle “Table not found” and “Table already exists” errors.
6. Practical Use Cases for Temporary Tables
MySQL temporary tables are used to make temporary data storage and processing more efficient. In this section, we introduce common scenarios where temporary tables are useful and explain implementation details.
1. Using as an intermediate table for aggregation
In data analysis and report generation, processing large datasets directly can slow down query execution. By using a temporary table, you can organize data first and then process it, improving performance.
Scenario
- The
salestable contains one year of sales data. - You want to calculate monthly total sales and perform further analysis.
Example implementation
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
userstable, 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
orderstable. - 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;
-- Cam kết giao dịch
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
- Nếu bạn không chỉ định
PRIMARY KEYhoặcINDEXtrongCREATE TEMPORARY TABLE, chúng sẽ không được tạo tự động. - Nếu bạn cần các chỉ mục trên bảng tạm, bạn phải tạo chúng thủ công.
4. Engine lưu trữ mặc định là MEMORY
- Với engine
MEMORY, kích thước dữ liệu lớn có thể gây chuyển đổi sang đĩa và giảm hiệu năng. - Nếu bạn chỉ định
InnoDB, nó có thể xử lý dữ liệu lớn hơn, nhưng việc sử dụng đĩa sẽ tăng lên.
5. Không bị ảnh hưởng bởi giao dịch
- Bảng tạm không bị ảnh hưởng bởi
ROLLBACK. - Do đó, chúng không phù hợp cho các xử lý yêu cầu tính nhất quán giao dịch chặt chẽ.
Các giải pháp thay thế cho bảng tạm
Để tránh những hạn chế này, bạn có thể sử dụng view hoặc subquery thay cho bảng tạm để xử lý dữ liệu linh hoạt hơn.
1. Sử dụng view
View có thể được sử dụng tương tự như bảng tạm để tham chiếu dữ liệu tạm thời. View hoạt động như một bảng ảo và không yêu cầu lưu trữ dữ liệu tạm, giúp tránh các ràng buộc về lưu trữ.
Tạo view
CREATE VIEW active_users AS
SELECT id, name, email FROM users WHERE last_login >= NOW() - INTERVAL 1 YEAR;
Sử dụng view
SELECT * FROM active_users;
Ưu điểm của việc sử dụng view
✅ Không tốn dung lượng lưu trữ (dữ liệu được tham chiếu trực tiếp, không cần lưu tạm thời)
✅ Không phụ thuộc vào phiên (có sẵn cho các người dùng và kết nối khác)
✅ Có thể giữ lại schema (bạn có thể xem định nghĩa bằng SHOW CREATE VIEW)
Nhược điểm của việc sử dụng view
❌ Khó cập nhật (việc INSERT hoặc UPDATE trực tiếp trên view bị hạn chế)
❌ Hiệu năng có thể giảm khi dữ liệu lớn
2. Sử dụng subquery
Bạn cũng có thể sử dụng subquery để xử lý dữ liệu tạm thời mà không cần tạo bảng tạm.
Sử dụng bảng tạm
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;
Sử dụng subquery
SELECT product_id, SUM(amount) AS total_sales
FROM orders
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;
Ưu điểm của việc sử dụng subquery
✅ Hiệu năng tốt hơn vì bạn không tạo bảng tạm
✅ Không tốn dung lượng lưu trữ
✅ Không phụ thuộc vào phiên và có thể thực thi bất kỳ lúc nào
Nhược điểm của việc sử dụng subquery
❌ Độ đọc hiểu có thể giảm đối với các truy vấn phức tạp
❌ Khó tái sử dụng dữ liệu (bạn có thể cần tham chiếu cùng một dữ liệu nhiều lần)
3. Sử dụng CTE (câu lệnh WITH)
Trong MySQL 8.0 trở lên, bạn có thể sử dụng CTE (Common Table Expression) để xử lý dữ liệu tạm thời mà không cần tạo bảng tạm.
Ví dụ 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;
Ưu điểm của việc sử dụng CTE
✅ Cải thiện độ đọc hiểu (thường dễ đọc hơn so với subquery)
✅ Có thể tối ưu hiệu năng (xử lý kiểu tạm thời mà không tạo bảng tạm)
Nhược điểm của việc sử dụng CTE
❌ Không khả dụng trong MySQL 5.x (chỉ hỗ trợ trong MySQL 8.0 trở lên)
Tóm tắt
| Method | Pros | Cons |
|---|---|---|
| Temporary table | Good for session-scoped data processing | Consumes storage and disappears when the session ends |
| View | No storage usage, not session-dependent | Hard to update, possible performance degradation |
| Subquery | No storage usage, simple | Hard to reuse, reduced readability |
| CTE (WITH) | Better readability, performance optimization | Available only in MySQL 8.0+ |
8. Câu hỏi thường gặp
Dưới đây là các câu hỏi thường gặp về bảng tạm MySQL. Chúng tôi hy vọng điều này giúp làm rõ cách chúng hoạt động và những hạn chế của chúng.
1. Bảng tạm có thể được tham chiếu từ các phiên khác không?
Không, chúng không thể.
Bảng tạm chỉ có sẵn trong phiên mà nó được tạo. Các phiên khác không thể truy cập nó. Ngay cả khi người dùng khác tạo một bảng tạm cùng tên, mỗi phiên sẽ coi đó là một bảng độc lập.
2. Cần những quyền nào để tạo bảng tạm?
Để tạo các bảng tạm, bạn cần có quyền CREATE TEMPORARY TABLES trên cơ sở dữ liệu.
Để cấp quyền này cho người dùng, hãy chạy câu lệnh SQL sau:
GRANT CREATE TEMPORARY TABLES ON database_name.* TO 'user_name'@'host';
Bạn cũng có thể kiểm tra các quyền hiện tại bằng cách sử dụng SHOW GRANTS.
SHOW GRANTS FOR 'user_name'@'host';
3. Các bảng tạm có ảnh hưởng đến việc sử dụng đĩa không?
Có, chúng có thể.
Mặc định, các bảng tạm của MySQL sử dụng engine MEMORY, nhưng khi kích thước dữ liệu vượt quá một ngưỡng nhất định, chúng sẽ được lưu trong khu vực tạm thời InnoDB.
Khi làm việc với các bộ dữ liệu lớn, các bảng tạm có thể tiêu tốn không gian đĩa. Do đó, được khuyến nghị xóa chúng một cách rõ ràng khi không còn cần thiết.
DROP TEMPORARY TABLE IF EXISTS table_name;
Để giảm thiểu tác động lên đĩa, nếu bạn dự đoán khối lượng dữ liệu lớn, hãy cân nhắc tạo bảng tạm bằng InnoDB thay vì MEMORY.
CREATE TEMPORARY TABLE table_name (
column1 data_type,
column2 data_type
) ENGINE=InnoDB;
4. Sự khác nhau giữa bảng tạm và bảng tạm nội bộ là gì?
| Item | Temporary table | Internal temporary table |
|---|---|---|
| Creation method | Created by the user with CREATE TEMPORARY TABLE | Automatically created by MySQL during processing such as GROUP BY |
| Scope | Only within the creating session | Only during query execution |
| Deletion | Explicitly dropped with DROP TEMPORARY TABLE | Automatically dropped when the query completes |
5. Các bảng tạm có thể được chia sẻ giữa các luồng không?
Không, chúng không thể.
Một bảng tạm chỉ có hiệu lực trong luồng (phiên) mà nó được tạo, và không thể được truy cập từ các luồng hoặc tiến trình khác.
Nếu bạn cần chia sẻ dữ liệu giữa các phiên/luồng, bạn phải tạo một bảng thường thay vì bảng tạm.
CREATE TABLE shared_temp_table (
id INT PRIMARY KEY,
data VARCHAR(255)
);
6. Các bảng tạm có thể làm giảm hiệu năng không?
Có, trong một số trường hợp.
Cụ thể, hãy cẩn thận trong các tình huống sau:
- Khi khối lượng dữ liệu quá lớn
- Engine
MEMORYcó giới hạn kích thước; khi vượt quá, dữ liệu có thể chuyển sangInnoDB, điều này có thể giảm hiệu năng . - Giải pháp: Nếu bạn dự đoán sẽ vượt quá giới hạn của
MEMORY, hãy tạo bảng bằngInnoDBngay từ đầu. - Khi không có các chỉ mục phù hợp
- Các bảng được tạo bằng
CREATE TEMPORARY TABLE ... SELECTkhông sao chép chỉ mục, do đó các truy vấn có thể chậm hơn. - Giải pháp: Thêm chỉ mục khi cần thiết bằng cách sử dụng
ALTER TABLE.ALTER TABLE temp_table_name ADD INDEX (column_name);
7. Làm thế nào để cải thiện hiệu năng của bảng tạm?
Để cải thiện hiệu năng của bảng tạm, các cách tiếp cận sau đây là hiệu quả:
✅ Sử dụng engine MEMORY (nhanh cho các bộ dữ liệu nhỏ)
CREATE TEMPORARY TABLE table_name (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=MEMORY;
✅ Chỉ chọn các cột cần thiết (bỏ qua các cột không cần thiết)
CREATE TEMPORARY TABLE users_temp AS
SELECT id, name FROM users;
✅ Thêm các chỉ mục phù hợp (tăng tốc độ tìm kiếm)
ALTER TABLE users_temp ADD INDEX (name);
✅ Xóa nó ngay khi không còn cần thiết (giải phóng bộ nhớ)
DROP TEMPORARY TABLE IF EXISTS users_temp;
Tóm tắt
- Bảng tạm không thể được tham chiếu từ các phiên hoặc luồng khác
- Bạn cần quyền
CREATE TEMPORARY TABLESđể tạo chúng - Nếu dữ liệu trở nên quá lớn, MySQL có thể chuyển từ
MEMORYsangInnoDB, điều này có thể làm giảm hiệu năng - Thêm các chỉ mục phù hợp có thể tăng tốc các truy vấn
- Việc xóa các bảng tạm bằng
DROP TEMPORARY TABLEđược khuyến nghị khi chúng không còn cần thiết
Đây là phần giải thích chi tiết về các bảng tạm của MySQL, từ các khái niệm cơ bản đến các trường hợp sử dụng, hạn chế, các giải pháp thay thế và các câu hỏi thường gặp.
Bằng cách sử dụng các bảng tạm một cách hợp lý, bạn có thể cải thiện đáng kể hiệu quả của quá trình xử lý dữ liệu.


