MySQL 需要創建隱式臨時表來解決某些類型的查詢。往往查詢的排序階段需要依賴臨時表。例如,當您使用 GROUP BY,ORDER BY 或DISTINCT 時。這樣的查詢分兩個階段執行:首先是收集數據并將它們放入臨時表中,然后是在臨時表上執行排序。
創新互聯建站是專業的黔西南州網站建設公司,黔西南州接單;提供做網站、網站制作,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行黔西南州網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
對于某些 UNION 語句,不能合并的 VIEW,子查詢時用到派生表,多表 UPDATE 以及其他一些情況,還需要使用臨時表。如果臨時表很小,可以到內存中創建,否則它將在磁盤上創建。MySQL 在內存中創建了一個表,如果它變得太大,就會被轉換為磁盤上存儲。內存臨時表的最大值由 tmp_table_size 或 max_heap_table_size 值定義,以較小者為準。MySQL 5.7 中的默認大小為 16MB。如果運行查詢的數據量較大,或者尚未查詢優化,則可以增加該值。設置閾值時,請考慮可用的 RAM 大小以及峰值期間的并發連接數。你無法無限期地增加變量,因為在某些時候你需要讓 MySQL 使用磁盤上的臨時表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,則即使大小小于配置的閾值,也會在磁盤上創建臨時表。
創建臨時表的語句與創建普通表相比,就是在CREATE后面增加一個單詞TEMP,其它語法同普通表,區別是不同連接之間建立的相同表名的臨時表不會沖突、連接關閉的時候臨時表會自動刪除。
例如:
CREATE TEMP TABLE ttt (id int, str char(32));
我們仍使用?實驗 05?中的環境,略去準備數據的過程。
我們仍然使用兩個會話,一個會話 run,用于運行主 SQL;另一個會話 ps,用于進行 performance_schema 的觀察:
主會話線程號為 29,
將 performance_schema 中的統計量重置,
臨時表的表大小限制取決于參數? tmp_table_size 和 max_heap_table_size 中較小者,我們實驗中以設置 max_heap_table_size 為例。
我們將會話級別的臨時表大小設置為 2M(小于上次實驗中臨時表使用的空間),執行使用臨時表的 SQL:
查看內存的分配記錄:
會發現內存分配略大于 2M,我們猜測臨時表會比配置略多一點消耗,可以忽略。
查看語句的特征值:
可以看到語句使用了一次需要落磁盤的臨時表。
那么這張臨時表用了多少的磁盤呢?
我們開啟 performance_schema 中 waits 相關的統計項:
重做實驗,略過。
再查看 performance_schema 的統計值:
可以看到幾個現象:
1. 臨時表空間被寫入了 7.92MiB 的數據。
2. 這些數據是語句寫入后,慢慢逐漸寫入的。
來看看這些寫入操作的特征,該方法我們在?實驗 03?使用過:
可以看到寫入的線程是 page_clean_thread,是一個刷臟操作,這樣就能理解數據為什么是慢慢寫入的。
也可以看到每個 IO 操作的大小是 16K,也就是刷數據頁的操作。
結論:
我們可以看到,
1. MySQL 會基本遵守 max_heap_table_size 的設定,在內存不夠用時,直接將表轉到磁盤上存儲。
2. 由于引擎不同(內存中表引擎為 heap,磁盤中表引擎則跟隨 internal_tmp_disk_storage_engine 的配置),本次實驗寫磁盤的數據量和?實驗 05?中使用內存的數據量不同。
3. 如果臨時表要使用磁盤,表引擎配置為 InnoDB,那么即使臨時表在一個時間很短的 SQL 中使用,且使用后即釋放,釋放后也會刷臟頁到磁盤中,消耗部分 IO。
解決辦法:
當臨時表不存在時,將查詢結果保存在臨時表中:
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name;
我的具體代碼是
CREATE temporary table tmp
(SELECT t1.pid a, t1.pname b,t2.pid c, t2.pdescribe d FROM
(SELECT pid,pname FROM admin_advert_place WHERE pid IN (3,4,5,6,7)) t1 LEFT JOIN
(SELECT pid,pdescribe FROM admin_advert_place
WHERE pgid IN (6,7,8)) t2 ON t1.pid = t2.pid)
分享題目:mysql怎么是臨時表 mysql什么是臨時表
網站URL:http://vcdvsql.cn/article14/doisdde.html
成都網站建設公司_創新互聯,為您提供、小程序開發、定制網站、網頁設計公司、靜態網站、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯