當(dāng)工作在非常大的表上時(shí) 你可能偶爾需要運(yùn)行很多查詢獲得一個(gè)大量數(shù)據(jù)的小的子集 不是對(duì)整個(gè)表運(yùn)行這些查詢 而是讓MySQL每次找出所需的少數(shù)記錄 將記錄選擇到一個(gè)臨時(shí)表可能更快些 然后多這些表運(yùn)行查詢 創(chuàng)建臨時(shí)表很容易 給正常的CREATE TABLE語句加上TEMPORARY關(guān)鍵字 CREATE TEMPORARY TABLE tmp_table (name VARCHAR( ) NOT NULL value INTEGER NOT NULL)臨時(shí)表將在你連接MySQL期間存在 當(dāng)你斷開時(shí) MySQL將自動(dòng)刪除表并釋放所用的空間 當(dāng)然你可以在仍然連接的時(shí)候刪除表并釋放空間 DROP TABLE tmp_table如果在你創(chuàng)建名為tmp_table臨時(shí)表時(shí)名為tmp_table的表在數(shù)據(jù)庫(kù)中已經(jīng)存在 臨時(shí)表將有必要屏蔽(隱藏)非臨時(shí)表tmp_table 如果你聲明臨時(shí)表是一個(gè)HEAP表 MySQL也允許你指定在內(nèi)存中創(chuàng)建它 CREATE TEMPORARY TABLE tmp_table (name VARCHAR( ) NOT NULL value INTEGER NOT NULL) TYPE = HEAP因?yàn)镠EAP表存儲(chǔ)在內(nèi)存中 你對(duì)它運(yùn)行的查詢可能比磁盤上的臨時(shí)表快些 然而 HEAP表與一般的表有些不同 且有自身的限制 詳見MySQL參考手冊(cè) 正如前面的建議 你應(yīng)該測(cè)試臨時(shí)表看看它們是否真的比對(duì)大量數(shù)據(jù)庫(kù)運(yùn)行查詢快 如果數(shù)據(jù)很好地索引 臨時(shí)表可能一點(diǎn)不快 lishixinzhi/Article/program/MySQL/201311/29492
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供寶坻網(wǎng)站建設(shè)、寶坻做網(wǎng)站、寶坻網(wǎng)站設(shè)計(jì)、寶坻網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、寶坻企業(yè)網(wǎng)站模板建站服務(wù),10年寶坻做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
MySQL 需要?jiǎng)?chuàng)建隱式臨時(shí)表來解決某些類型的查詢。往往查詢的排序階段需要依賴臨時(shí)表。例如,當(dāng)您使用 GROUP BY,ORDER BY 或DISTINCT 時(shí)。這樣的查詢分兩個(gè)階段執(zhí)行:首先是收集數(shù)據(jù)并將它們放入臨時(shí)表中,然后是在臨時(shí)表上執(zhí)行排序。
對(duì)于某些 UNION 語句,不能合并的 VIEW,子查詢時(shí)用到派生表,多表 UPDATE 以及其他一些情況,還需要使用臨時(shí)表。如果臨時(shí)表很小,可以到內(nèi)存中創(chuàng)建,否則它將在磁盤上創(chuàng)建。MySQL 在內(nèi)存中創(chuàng)建了一個(gè)表,如果它變得太大,就會(huì)被轉(zhuǎn)換為磁盤上存儲(chǔ)。內(nèi)存臨時(shí)表的最大值由 tmp_table_size 或 max_heap_table_size 值定義,以較小者為準(zhǔn)。MySQL 5.7 中的默認(rèn)大小為 16MB。如果運(yùn)行查詢的數(shù)據(jù)量較大,或者尚未查詢優(yōu)化,則可以增加該值。設(shè)置閾值時(shí),請(qǐng)考慮可用的 RAM 大小以及峰值期間的并發(fā)連接數(shù)。你無法無限期地增加變量,因?yàn)樵谀承r(shí)候你需要讓 MySQL 使用磁盤上的臨時(shí)表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,則即使大小小于配置的閾值,也會(huì)在磁盤上創(chuàng)建臨時(shí)表。
1、臨時(shí)表再斷開于mysql的連接后系統(tǒng)會(huì)自動(dòng)刪除臨時(shí)表中的數(shù)據(jù),但是這只限于用下面語句建立的表:
1)定義字段
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)
2)直接將查詢結(jié)果導(dǎo)入臨時(shí)表
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
2、另外mysql也允許你在內(nèi)存中直接創(chuàng)建臨時(shí)表,因?yàn)槭窃趦?nèi)存中所有速度會(huì)很快,語法如下:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP
3、從上面的分析可以看出臨時(shí)表的數(shù)據(jù)是會(huì)被清空的,你斷開了連接就會(huì)被自動(dòng)清空,但是你程序中不可能每發(fā)行一次sql就連接一次數(shù)據(jù)庫(kù)吧(如果是這樣的話,那就會(huì)出現(xiàn)你擔(dān)心的問題,如果不是就沒有問題),因?yàn)橹挥袛嚅_數(shù)據(jù)庫(kù)連接才會(huì)被清空數(shù)據(jù),在一個(gè)數(shù)據(jù)庫(kù)連接里面發(fā)行多次sql的話系統(tǒng)是不會(huì)自動(dòng)清空臨時(shí)表數(shù)據(jù)的。
---
以上,希望對(duì)你有所幫助。
臨時(shí)表和普通表的操作是一樣的,正常怎么插入就怎么插入。只不過臨時(shí)表在當(dāng)前會(huì)話結(jié)束后會(huì)被刪掉而已。
我們?nèi)允褂?實(shí)驗(yàn) 05?中的環(huán)境,略去準(zhǔn)備數(shù)據(jù)的過程。
我們?nèi)匀皇褂脙蓚€(gè)會(huì)話,一個(gè)會(huì)話 run,用于運(yùn)行主 SQL;另一個(gè)會(huì)話 ps,用于進(jìn)行 performance_schema 的觀察:
主會(huì)話線程號(hào)為 29,
將 performance_schema 中的統(tǒng)計(jì)量重置,
臨時(shí)表的表大小限制取決于參數(shù)? tmp_table_size 和 max_heap_table_size 中較小者,我們實(shí)驗(yàn)中以設(shè)置 max_heap_table_size 為例。
我們將會(huì)話級(jí)別的臨時(shí)表大小設(shè)置為 2M(小于上次實(shí)驗(yàn)中臨時(shí)表使用的空間),執(zhí)行使用臨時(shí)表的 SQL:
查看內(nèi)存的分配記錄:
會(huì)發(fā)現(xiàn)內(nèi)存分配略大于 2M,我們猜測(cè)臨時(shí)表會(huì)比配置略多一點(diǎn)消耗,可以忽略。
查看語句的特征值:
可以看到語句使用了一次需要落磁盤的臨時(shí)表。
那么這張臨時(shí)表用了多少的磁盤呢?
我們開啟 performance_schema 中 waits 相關(guān)的統(tǒng)計(jì)項(xiàng):
重做實(shí)驗(yàn),略過。
再查看 performance_schema 的統(tǒng)計(jì)值:
可以看到幾個(gè)現(xiàn)象:
1. 臨時(shí)表空間被寫入了 7.92MiB 的數(shù)據(jù)。
2. 這些數(shù)據(jù)是語句寫入后,慢慢逐漸寫入的。
來看看這些寫入操作的特征,該方法我們?cè)?實(shí)驗(yàn) 03?使用過:
可以看到寫入的線程是 page_clean_thread,是一個(gè)刷臟操作,這樣就能理解數(shù)據(jù)為什么是慢慢寫入的。
也可以看到每個(gè) IO 操作的大小是 16K,也就是刷數(shù)據(jù)頁的操作。
結(jié)論:
我們可以看到,
1. MySQL 會(huì)基本遵守 max_heap_table_size 的設(shè)定,在內(nèi)存不夠用時(shí),直接將表轉(zhuǎn)到磁盤上存儲(chǔ)。
2. 由于引擎不同(內(nèi)存中表引擎為 heap,磁盤中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實(shí)驗(yàn)寫磁盤的數(shù)據(jù)量和?實(shí)驗(yàn) 05?中使用內(nèi)存的數(shù)據(jù)量不同。
3. 如果臨時(shí)表要使用磁盤,表引擎配置為 InnoDB,那么即使臨時(shí)表在一個(gè)時(shí)間很短的 SQL 中使用,且使用后即釋放,釋放后也會(huì)刷臟頁到磁盤中,消耗部分 IO。
新聞名稱:mysql怎么導(dǎo)入臨時(shí)表 sql新建臨時(shí)表并導(dǎo)入數(shù)據(jù)
URL分享:http://www.chinadenli.net/article24/doogije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、Google、靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、軟件開發(fā)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)