MySQL中的臨時(shí)表與內(nèi)存表
在MySQL中有三種虛擬表:臨時(shí)表、內(nèi)存表、視圖。下面簡(jiǎn)單介紹一下臨時(shí)表和內(nèi)存表的使用。
1、臨時(shí)表
MySQL臨時(shí)表在我們需要保存一些臨時(shí)數(shù)據(jù)時(shí)是非常有用的。臨時(shí)表在MySQL 3.23版本中添加。
臨時(shí)表只在當(dāng)前連接可見(jiàn),當(dāng)關(guān)閉連接時(shí),Mysql會(huì)自動(dòng)刪除表并釋放所有空間。
如果你使用了其他MySQL客戶端程序連接MySQL數(shù)據(jù)庫(kù)服務(wù)器來(lái)創(chuàng)建臨時(shí)表,那么只有在關(guān)閉客戶端程序時(shí)才會(huì)銷毀臨時(shí)表,當(dāng)然你也可以手動(dòng)銷毀。
1.1 創(chuàng)建臨時(shí)表
在MySQL中創(chuàng)建臨時(shí)表使用CREATE TEMPORARY TABLE語(yǔ)句,其語(yǔ)法格式如下:
CREATE TEMPORARY TABLE [IF NOT EXISTS] 臨時(shí)表名 ( ... );
示例:
創(chuàng)建臨時(shí)表。
CREATE TEMPORARY TABLE IF NOT EXISTS temp_user ( id INT NOT NULL DEFAULT 0, name VARCHAR(10) NOT NULL );
還可以通過(guò)復(fù)制表的方式來(lái)創(chuàng)建臨時(shí)表。
示例:
通過(guò)復(fù)制表的方式來(lái)創(chuàng)建臨時(shí)表。
CREATE TEMPORARY TABLE temp_user AS SELECT * FROM tb_user;
1.2 刪除臨時(shí)表
默認(rèn)情況下,當(dāng)你斷開(kāi)與數(shù)據(jù)庫(kù)的連接后,臨時(shí)表就會(huì)自動(dòng)被銷毀。
當(dāng)然你也可以在當(dāng)前MySQL會(huì)話中手動(dòng)刪除臨時(shí)表。
刪除臨時(shí)表與刪除普通表的語(yǔ)句是一樣的,使用 DROP TABLE語(yǔ)句。
示例:
刪除臨時(shí)表。
DROP TABLE IF EXISTS temp_user;
1.3 使用臨時(shí)表的注意事項(xiàng)
(1)臨時(shí)表只在當(dāng)前連接可見(jiàn),當(dāng)這個(gè)連接關(guān)閉的時(shí)候,會(huì)自動(dòng)drop。比如打開(kāi)mysql 就是一個(gè)連接會(huì)話。兩個(gè)不同的連接可以使用相同名字的臨時(shí)表,兩個(gè)表之間不存在什么關(guān)系,如果臨時(shí)表的名字和已經(jīng)存在的磁盤(pán)表名字一樣,那么臨時(shí)表會(huì)暫時(shí)覆蓋磁盤(pán)表。就是說(shuō),你select 查詢,只會(huì)顯示臨時(shí)表里面的,不會(huì)顯示磁盤(pán)表。
(2)臨時(shí)表的存儲(chǔ)引擎:memor,myisam,merge,innodb,臨時(shí)表不支持mysql cluster簇。
(3)同一個(gè)查詢語(yǔ)句,只能用一次臨時(shí)表,就是說(shuō)不能將表和自己做連接等。
(4)重命名表,不能用rename 可以用alter table代替。
(5)如果超出了臨時(shí)表的容量,臨時(shí)表會(huì)轉(zhuǎn)換成磁盤(pán)表。
(6)show tables語(yǔ)句不會(huì)列出臨時(shí)表,在information_schema中也不存在臨時(shí)表信息,show create table可以查看臨時(shí)表。
2、內(nèi)存表
內(nèi)存表的表結(jié)構(gòu)建立在磁盤(pán)里面,數(shù)據(jù)放在內(nèi)存里面;
當(dāng)MySQL斷開(kāi)當(dāng)前連接后,臨時(shí)表的表結(jié)構(gòu)和表數(shù)據(jù)都沒(méi)了,但內(nèi)存表的表結(jié)構(gòu)和表數(shù)據(jù)都存在;
當(dāng)MySQL服務(wù)重啟之后,內(nèi)存表的數(shù)據(jù)會(huì)丟失,但表結(jié)構(gòu)依舊存。
2.1 創(chuàng)建內(nèi)存表
創(chuàng)建內(nèi)存表與創(chuàng)建普通表一樣,使用CREATE TABLE語(yǔ)句,但需要將存儲(chǔ)引擎設(shè)置為:ENGINE = MEMORY。
其語(yǔ)法格式如下:
CREATE TABLE [IF NOT EXISTS] 內(nèi)存表名 ( ... ) ENGINE = MEMORY;
示例:
創(chuàng)建內(nèi)存表。
CREATE TABLE IF NOT EXISTS tmp_table ( id INT NOT NULL DEFAULT 0, name VARCHAR(10) NOT NULL ) ENGINE = MEMORY;
2.2 刪除內(nèi)存表
刪除內(nèi)存表與刪除普通表的語(yǔ)句是一樣的,使用 DROP TABLE語(yǔ)句。
示例:
刪除內(nèi)存表。
DROP TABLE IF EXISTS tmp_table;
2.3 使用內(nèi)存表的注意事項(xiàng)
(1)當(dāng)MySQL服務(wù)重啟之后,內(nèi)存表的數(shù)據(jù)會(huì)丟失,表結(jié)構(gòu)依舊存。
(2)多個(gè)session,創(chuàng)建表的名字不能一樣。
(3)一個(gè)session創(chuàng)建會(huì)話后,對(duì)其他session也是可見(jiàn)的。
(4)data目錄下只有tmp_memory.frm,表結(jié)構(gòu)放在磁盤(pán)上,數(shù)據(jù)放在內(nèi)存中。
(5)可以創(chuàng)建索引,刪除索引,支持唯一索引。
(6)不影響主備,主庫(kù)上插入的數(shù)據(jù),備庫(kù)也可以查到。
(7)show tables 語(yǔ)句可以查看得到表。
(8)內(nèi)存表不能包含BLOB或者TEXT列。
(9)內(nèi)存表支持AUTO_INCREMENT列。
3、臨時(shí)表與內(nèi)存表區(qū)別
臨時(shí)表 | 內(nèi)存表 | |
---|---|---|
存儲(chǔ) | 表結(jié)構(gòu)和數(shù)據(jù)都存儲(chǔ)在內(nèi)存中 | 表結(jié)構(gòu)存儲(chǔ)在磁盤(pán)中,表數(shù)據(jù)存儲(chǔ)在內(nèi)存中 |
會(huì)話 | 單個(gè)會(huì)話獨(dú)享的,是會(huì)話級(jí)別的 | 可以多個(gè)會(huì)話共享 |
引擎 | 臨時(shí)表默認(rèn),myisam | 內(nèi)存表默認(rèn),memory |
斷開(kāi)連接 | 表結(jié)構(gòu)和表數(shù)據(jù)都沒(méi)了 | 表結(jié)構(gòu)和表數(shù)據(jù)都存在 |
服務(wù)重啟 | 表結(jié)構(gòu)和表數(shù)據(jù)都沒(méi)了 | 表結(jié)構(gòu)存在,表數(shù)據(jù)不存在 |
性能 | 由于表數(shù)據(jù)都是存放在內(nèi)存中,所以相對(duì)來(lái)說(shuō),查詢速度較快,但是數(shù)據(jù)的維護(hù)較為困難 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL如何實(shí)現(xiàn)跨庫(kù)join查詢
這篇文章主要介紹了MySQL如何實(shí)現(xiàn)跨庫(kù)join查詢問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03MySQL數(shù)據(jù)庫(kù)優(yōu)化詳解
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)優(yōu)化的方方面面,各種小技巧,需要的朋友可以參考下2014-08-08MYSQL索引建立需要注意以下幾點(diǎn)細(xì)節(jié)
建立MYSQL索引時(shí)需要注意以下幾點(diǎn):建立索引的時(shí)機(jī)/對(duì)于like/對(duì)于有多個(gè)條件的/開(kāi)啟索引緩存/建立索引是有代價(jià)的等等,感興趣的你可以參考下本文,或許可以幫助到你2013-03-03Mysql避免重復(fù)插入數(shù)據(jù)的4種方式
這篇文章主要介紹了Mysql避免重復(fù)插入數(shù)據(jù)的4種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log)
這篇文章主要介紹了mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05MySQL分表和分區(qū)分表的區(qū)別小結(jié)
MySQL分表和分區(qū)分表是兩種常見(jiàn)的數(shù)據(jù)分割方案,本文主要介紹了MySQL分表和分區(qū)分表的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07mysql格式化字符串長(zhǎng)度不夠補(bǔ)0問(wèn)題
這篇文章主要介紹了mysql格式化字符串長(zhǎng)度不夠補(bǔ)0問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11mysql執(zhí)行語(yǔ)句后只有錯(cuò)誤代碼,沒(méi)有錯(cuò)誤信息的問(wèn)題
這篇文章主要介紹了mysql執(zhí)行語(yǔ)句后只有錯(cuò)誤代碼,沒(méi)有錯(cuò)誤信息的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09