臨時(shí)表是mysql中用于臨時(shí)存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),僅對(duì)當(dāng)前連接可見,斷開后自動(dòng)消失。創(chuàng)建方法是在create table語句前加temporary關(guān)鍵字,例如:create temporary table temp_users (id int primary key, name varchar(50)); 也可通過create temporary table … as select方式從現(xiàn)有表復(fù)制數(shù)據(jù)。適用場景包括:1. 存儲(chǔ)中間結(jié)果簡化復(fù)雜查詢;2. 避免重復(fù)計(jì)算提升效率;3. 批量處理前的數(shù)據(jù)清洗;4. 多sql語句間共享數(shù)據(jù)。使用時(shí)需注意:1. 作用范圍僅限當(dāng)前會(huì)話;2. 命名應(yīng)避免與普通表沖突;3. 事務(wù)中創(chuàng)建的臨時(shí)表在提交或回滾后仍存在;4. 不支持外鍵約束。合理使用可提升性能,但不宜在大數(shù)據(jù)量或高并發(fā)場景濫用。
創(chuàng)建mysql臨時(shí)表其實(shí)不復(fù)雜,用法也挺靈活。它和普通表的區(qū)別在于生命周期短,只在當(dāng)前會(huì)話或事務(wù)中存在,適合處理一些中間數(shù)據(jù)或者臨時(shí)結(jié)果。
什么是臨時(shí)表?怎么創(chuàng)建?
臨時(shí)表顧名思義就是“臨時(shí)用一下”的表,它的數(shù)據(jù)只對(duì)當(dāng)前連接可見,斷開連接后自動(dòng)消失。創(chuàng)建方式很簡單,就是在CREATE TABLE語句前加上TEMPORARY關(guān)鍵字。例如:
CREATE TEMPORARY TABLE temp_users ( id int PRIMARY KEY, name VARCHAR(50) );
你也可以像創(chuàng)建普通表一樣插入、查詢、更新這個(gè)表的數(shù)據(jù)。但注意,一旦連接斷開,這張表就沒了,數(shù)據(jù)也不會(huì)保留。
還有一種情況是使用CREATE TEMPORARY TABLE … AS select的方式,直接從現(xiàn)有表中復(fù)制一部分?jǐn)?shù)據(jù)過來:
CREATE TEMPORARY TABLE temp_active_users AS SELECT * FROM users WHERE status = 'active';
這種方式很適合在做數(shù)據(jù)篩選或預(yù)處理時(shí)用。
哪些場景適合用臨時(shí)表?
臨時(shí)表的適用場景其實(shí)挺多的,主要是用來簡化復(fù)雜查詢或提高執(zhí)行效率。常見的幾個(gè)場景包括:
-
中間結(jié)果存儲(chǔ):比如你要寫一個(gè)復(fù)雜的報(bào)表查詢,中間會(huì)產(chǎn)生很多中間結(jié)果,這時(shí)候就可以把每一步的結(jié)果存到臨時(shí)表里,后面再復(fù)用。
-
避免重復(fù)計(jì)算:如果某個(gè)子查詢會(huì)被多次用到,可以先把它存到臨時(shí)表里,這樣每次查都快,不用反復(fù)算。
-
批量處理數(shù)據(jù)前的準(zhǔn)備:比如你在導(dǎo)入一批數(shù)據(jù)之前,想先做一些清洗、過濾,就可以先把數(shù)據(jù)放到臨時(shí)表里處理好了,再插進(jìn)正式表。
-
跨多個(gè)sql語句共享數(shù)據(jù):有時(shí)候你需要分步驟處理數(shù)據(jù),而這些步驟之間又需要共享某些中間數(shù)據(jù),臨時(shí)表就很適合這種情況。
比如你有一張訂單表,想統(tǒng)計(jì)每個(gè)用戶的最近一筆訂單,就可以先用GROUP BY和MAX函數(shù)找出每個(gè)用戶的最新訂單時(shí)間,然后把這些結(jié)果存到臨時(shí)表里,再和其他表關(guān)聯(lián)查詢。
使用臨時(shí)表需要注意什么?
雖然臨時(shí)表用起來方便,但也有一些需要注意的地方。
首先是作用范圍。臨時(shí)表只能在當(dāng)前會(huì)話中使用,不同連接之間看不到彼此的臨時(shí)表。也就是說,A用戶創(chuàng)建了一個(gè)temp_table,B用戶是查不到的。
其次是命名沖突問題。如果你不小心起了一個(gè)和現(xiàn)有表一樣的名字,那MySQL在解析的時(shí)候會(huì)優(yōu)先使用臨時(shí)表。所以建議臨時(shí)表的名字盡量有區(qū)分度,比如加個(gè)tmp_前綴之類的。
還有一個(gè)容易忽略的是事務(wù)中的行為。如果你在事務(wù)中創(chuàng)建了臨時(shí)表,那么它會(huì)在事務(wù)提交或回滾之后繼續(xù)存在(只要連接沒斷),這點(diǎn)跟普通表的行為是一樣的。
另外,臨時(shí)表不能有外鍵約束,也不能被其他會(huì)話訪問,所以在設(shè)計(jì)的時(shí)候要注意這些限制。
基本上就這些。臨時(shí)表是個(gè)實(shí)用的小工具,用得好的話能簡化邏輯、提升性能。不過別濫用,特別是當(dāng)數(shù)據(jù)量很大或者并發(fā)很高的時(shí)候,還是要考慮其他更穩(wěn)定的方式。