mysql 临时表 概念_临时表的概念
union all只是合并查詢結果,并不會進行去重和排序操作,在沒有去重的前提下,使用union all的執容行效率要比union高
一、臨時表的概念
在我們操作的表數據量龐大而且又要關聯其他表進行查詢的時候或者我們操作的數據是臨時性數據且在短期內會有很多DML操作(比如購物車)的時候或者我們做查詢時需要連接很多個表的時候,如果直接操作數據庫的業務表可能效率很低,這個時候我們就可以借助臨時表來提升效率。
臨時表顧名思義,是一個臨時的表,數據庫不會將其序列化到磁盤上(有些也會序列化到磁盤上)而是存在于數據庫服務器的內存中(因此會增加數據庫服務器內存的消耗),在使用完之后就會銷毀。臨時表分為兩種:會話臨時表和全局臨時表,區別在于可用的作用域和銷毀的時機不同。會話臨時表只在當前會話(連接)內可用,且在當前會話結束(斷開數據庫連接)后就會銷毀;全局臨時表創建后在銷毀之前所有用戶都可以訪問,銷毀的時機是在創建該臨時表的連接斷開且沒有其他會話訪問時才銷毀,實際上在創建全局臨時表的會話斷開后,其他用戶就已經不能在訪問該臨時表了,但此時該臨時表并不會立即銷毀,而是等所有正在使用該全局臨時表的會話(或者說連接)斷開之后才會銷毀。當然有時考慮到內存占用的問題,我們也可以手動銷毀(DROP)臨時表。
目前大多數數據庫廠商(Oracle、Sql Server、Mysql)都支持臨時表,但不同的數據庫創建和使用臨時表的語法稍有不同。
二、臨時表的創建、使用和刪除
1、SQL Server
創建:
方式一:
#會話臨時表
CREATE TABLE #臨時表名(
字段1 約束條件1,
字段2 約束條件2,
...
);
#全局臨時表
CREATE TABLE ##臨時表名(
字段1 約束條件,
字段2 約束條件,
...
);
12345678910111213
方式二:
#會話臨時表
SELECT 字段列表 INTO #臨時表名
FROM 業務表;
#全局臨時表
SELECT 字段列表 INTO ##臨時表名
FROM 業務表;
1234567
使用:
#查詢臨時表
SELECT * FROM #臨時表名;
SELECT * FROM ##臨時表名;
123
刪除:
#刪除臨時表
DROP TABLE #臨時表名;
DROP TABLE ##臨時表名;
123
2、Mysql
創建:Mysql中沒有全局臨時表,創建的時候沒有#
CREATE TEMPORARY TABLE [IF NOT EXISTS] 臨時表名(
字段1 約束條件,
字段2 約束條件,
...
);
#根據現有表創建臨時表
CREATE TEMPORARY TABLE [IF NOT EXISTS] 臨時表名
[AS] SELECT 查詢字段
FROM 業務表
[WHERE 條件];
1234567891011
使用:創建的臨時表可以和業務表同名,若臨時表和業務表同名時在該會話中會使用臨時表
SELECT * FROM 臨時表名;
1
刪除:為避免臨時表名和業務表名相同時導致誤刪除,可以加上TEMPORARY關鍵字
DROP [TEMPORARY] TABLE 臨時表名;
1
3、Oracle
Oracle的臨時表也只有會話級的,但同時又細化出了一個事務級別的臨時表,事務級別的臨時表只在當前事務中有效。
創建:
#會話級別
CREATE GLOBAL TEMPORARY TABLE 臨時表名(
字段1 約束條件,
字段2 約束條件,
...
) ON COMMIT PRESERVE ROWS;
#事務級別
CREATE GLOBAL TEMPORARY TABLE 臨時表名(
字段1 約束條件,
字段2 約束條件,
...
) ON COMMIT DELETE ROWS;
12345678910111213
使用:
SELECT * FROM 臨時表名;
1
刪除:
DROP TABLE 臨時表名;
1
注意:一個SQL中不能同時出現兩次臨時表
三、臨時表的應用
企業開發中大多都是使用Spring進行事務管理的,很少自己開啟事務、提交事務。我們大多都會將事務加在service層,這樣在調用service層的每一個方法之前Spring都會為我們開啟事務,在方法調用結束之后Spring會為我們提交事務,問題是數據庫事務需要的數據庫連接是在什么時候獲取和釋放的呢?這個是會影響我們對臨時表的使用的。
一般來說,數據庫連接是在事務開啟之前獲取的,也就是在我們調用事務方法之前,肯定要先獲取數據庫連接,然后才能開啟事務,提交或回滾事務,然后關閉數據庫連接,這種情況下貌似如果我們在該方法中創建了臨時表,則在此之后直至方法結束之前我們都可以使用這個創建的臨時表,這么說基本上是正確的。但有一種情況除外那就是如果我們在事務方法A中調用了另一個事務方法B,而事務方法B的事務傳播機制是PROPAGATION_REQUIRES_NEW(將原事務掛起,并新開一個事務)時,如果臨時表是在B方法中創建的,則A在調用完B之后(B的事務已經提交了)也不可以使用B中創建的事務級別的臨時表,但是可以使用會話級別的臨時表以及全局臨時表。
————————————————
版權聲明:本文為CSDN博主「如不來」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/rubulai/java/article/details/95248627
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的mysql 临时表 概念_临时表的概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql实型_mysql 数据类型
- 下一篇: mysql事务实战_MySQL - 实战