當工作在非常大的表上時 你可能偶爾需要運行很多查詢獲得一個大量數(shù)據(jù)的小的子集 不是對整個表運行這些查詢 而是讓MySQL每次找出所需的少數(shù)記錄 將記錄選擇到一個臨時表可能更快些 然后多這些表運行查詢 創(chuàng)建臨時表很容易 給正常的CREATE TABLE語句加上TEMPORARY關(guān)鍵字 CREATE TEMPORARY TABLE tmp_table (name VARCHAR( ) NOT NULL value INTEGER NOT NULL)臨時表將在你連接MySQL期間存在 當你斷開時 MySQL將自動刪除表并釋放所用的空間 當然你可以在仍然連接的時候刪除表并釋放空間 DROP TABLE tmp_table如果在你創(chuàng)建名為tmp_table臨時表時名為tmp_table的表在數(shù)據(jù)庫中已經(jīng)存在 臨時表將有必要屏蔽(隱藏)非臨時表tmp_table 如果你聲明臨時表是一個HEAP表 MySQL也允許你指定在內(nèi)存中創(chuàng)建它 CREATE TEMPORARY TABLE tmp_table (name VARCHAR( ) NOT NULL value INTEGER NOT NULL) TYPE = HEAP因為HEAP表存儲在內(nèi)存中 你對它運行的查詢可能比磁盤上的臨時表快些 然而 HEAP表與一般的表有些不同 且有自身的限制 詳見MySQL參考手冊 正如前面的建議 你應(yīng)該測試臨時表看看它們是否真的比對大量數(shù)據(jù)庫運行查詢快 如果數(shù)據(jù)很好地索引 臨時表可能一點不快 lishixinzhi/Article/program/MySQL/201311/29492
創(chuàng)新互聯(lián)建站從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元沁水做網(wǎng)站,已為上家服務(wù),為沁水各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
MySQL臨時目錄用于存儲臨時文件或臨時表,值可以是一個使用“:”(Unix)或“;”(Windows)分隔的路徑列表,這些路徑可被輪流使用,以便將負載分到不同磁盤。
若MySQL server是作為Slave的角色,則不能將該目錄指向基于內(nèi)存文件系統(tǒng)的目錄或者當主機重啟時會被清理掉的目錄,因為Slave需要這些文件復(fù)制臨時表或執(zhí)行LOAD DATA INFILE操作,這些文件丟失會導(dǎo)致復(fù)制失敗。這意味著不能將slave的tmpdir設(shè)置為linux系統(tǒng)默認的/tmp目錄。
對于Slave可以使用另一配置項slave_load_tmpdir來設(shè)置其臨時目錄,這樣Slave可以不使用通用選項tmpdir設(shè)置的臨時目錄,對于非Slave角色的MySQL?server沒此限制。
若臨時目錄不存在或權(quán)限不正確不僅會引起MySQL Server啟動失敗還會導(dǎo)致其他可能使用到臨時目錄的MySQL實用程序運行異常。很多MySQL相關(guān)程序會從MySQL Server的配置文件讀取選項值。
MySQL 日志配置
MySQL的tmpdir臨時文件說明及使用設(shè)置
一個MysQL /tmp目錄爆滿問題的處理
Shall I change the mysql tmpdir from /tmp to /var/lib/mysql/tmp ?
MySQL 臨時目錄
How to know if mysql tmpdir is being used?
MySQL, RAM disk for tmpdir?
Changing the tmp folder of MySQL
MySQL 需要創(chuàng)建隱式臨時表來解決某些類型的查詢。往往查詢的排序階段需要依賴臨時表。例如,當您使用 GROUP BY,ORDER BY 或DISTINCT 時。這樣的查詢分兩個階段執(zhí)行:首先是收集數(shù)據(jù)并將它們放入臨時表中,然后是在臨時表上執(zhí)行排序。
對于某些 UNION 語句,不能合并的 VIEW,子查詢時用到派生表,多表 UPDATE 以及其他一些情況,還需要使用臨時表。如果臨時表很小,可以到內(nèi)存中創(chuàng)建,否則它將在磁盤上創(chuàng)建。MySQL 在內(nèi)存中創(chuàng)建了一個表,如果它變得太大,就會被轉(zhuǎn)換為磁盤上存儲。內(nèi)存臨時表的最大值由 tmp_table_size 或 max_heap_table_size 值定義,以較小者為準。MySQL 5.7 中的默認大小為 16MB。如果運行查詢的數(shù)據(jù)量較大,或者尚未查詢優(yōu)化,則可以增加該值。設(shè)置閾值時,請考慮可用的 RAM 大小以及峰值期間的并發(fā)連接數(shù)。你無法無限期地增加變量,因為在某些時候你需要讓 MySQL 使用磁盤上的臨時表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,則即使大小小于配置的閾值,也會在磁盤上創(chuàng)建臨時表。