摘要:評估結(jié)合查詢可能需要臨時表。要確定語句是否需要臨時表,請使用并檢查列以查看是否顯示請參見第節(jié)使用優(yōu)化查詢。這些條件符合條件,無需臨時表是,不是或。內(nèi)存中臨時表的最大大小由兩者中和中較小的決定。系統(tǒng)變量可以用來強制內(nèi)部臨時表的磁盤存儲。
源鏈接:https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html
在某些情況下,服務(wù)器在處理Sql語句時創(chuàng)建內(nèi)部臨時表。用戶無法直接控制何時發(fā)生。
服務(wù)器在以下條件下創(chuàng)建臨時表:
(Evaluation有什么特殊意思嗎?我翻譯成了評估)
聲明的 UNION 評估,稍后描述一些例外。
評估一些視圖,如使用 TEMPTABLE 算法, UNION 或聚合的視圖。
派生表(FROM 從句中的子查詢)。
創(chuàng)建用于子查詢或半連接實現(xiàn)的表。
評估包含一個 ORDER BY 子句和一個不同的 GROUP BY 子句的語句,或者對于該語句 ORDER BY 或 GROUP BY 包含來自連接隊列中的第一個表之外的列的列。
評估 DISTINCT 結(jié)合 ORDER BY 查詢可能需要臨時表。
對于使用 SQL_SMALL_RESULT 修飾符的查詢,MySQL使用內(nèi)存中臨時表,除非查詢還包含需要磁盤存儲的元素(稍后介紹)。
評估多表 UPDATE 語句。
評估 GROUP_CONCAT() 或 COUNT(DISTINCT) 表達式。
要確定語句是否需要臨時表,請使用 EXPLAIN 并檢查 Extra 列以查看是否顯示 Using temporary(請參見 第9.8.1節(jié)“使用 EXPLAIN 優(yōu)化查詢”)。對于派生或物理化的臨時表, EXPLAIN 不一定說 Using temporary。
當(dāng)服務(wù)器創(chuàng)建內(nèi)部臨時表(在內(nèi)存或磁盤上)時,會增加 Created_tmp_tables 狀態(tài)變量。如果服務(wù)器在磁盤上創(chuàng)建表(最初或通過轉(zhuǎn)換內(nèi)存中的表),它會增加 Created_tmp_disk_tables 狀態(tài)變量。
某些查詢條件阻止使用內(nèi)存中臨時表,在這種情況下,服務(wù)器會使用磁盤表:
表中 存在 BLOB 或 TEXT 列
在 SELECT 列表中存在任何字符串列的最大長度大于512(二進制字符串的字節(jié),非二進制字符的字符),如果UNION 或 UNION ALL 使用的情況下
SHOW COLUMNS 和 DESCRIBE 語句中使用 BLOB 作為用于某些字段的數(shù)據(jù)類型,從而用于結(jié)果的臨時表是磁盤上的表。
服務(wù)器不使用 UNION 符合特定條件語句的臨時表。相反,它保留了從臨時表創(chuàng)建唯一的數(shù)據(jù)結(jié)構(gòu)進行必要的結(jié)果列的類型轉(zhuǎn)換。表沒有完全實例化,沒有行被寫入或讀取; 行直接發(fā)送到客戶端。結(jié)果是減少了內(nèi)存和磁盤要求,并且在將第一行發(fā)送到客戶端之前的較小延遲,因為服務(wù)器不需要等待直到最后一個查詢塊被執(zhí)行。EXPLAIN 優(yōu)化器跟蹤輸出反映了此執(zhí)行策略:UNION RESULT 查詢塊不存在,因為該塊對應(yīng)于從臨時表讀取的部分。
這些條件符合條件 UNION ,無需臨時表:
union 是 UNION ALL,不是 UNION 或 UNION DISTINCT。
沒有全局 ORDER BY 從句。
union 不是一個 {INSERT | REPLACE} ... SELECT 操作的頂級語句的查詢塊。
用于臨時表的存儲引擎
臨時表存儲格式
用于臨時表的存儲引擎
內(nèi)部臨時表可以在保存內(nèi)存中并且由 MEMORY 存儲引擎處理,或者以 InnoDB 或 MyISAM 存儲引擎存儲在磁盤上。
如果表是內(nèi)部臨時表并且被存儲在內(nèi)存中,但是變得太大,MySQL 會自動將其轉(zhuǎn)換為磁盤表。內(nèi)存中臨時表的最大大小由兩者中 tmp_table_size 和 max_heap_table_size 中較小的決定。這與使用 CREATE TABLE 顯式創(chuàng)建的內(nèi)存表不同, 對于這樣的表,只有 max_heap_table_size 系統(tǒng)變量確定表允許增長的大小,并且沒有轉(zhuǎn)換為磁盤格式。
所述 internal_tmp_disk_storage_engine 系統(tǒng)變量確定服務(wù)器使用哪個存儲引擎來管理的磁盤上的內(nèi)部臨時表。允許的值為 INNODB (默認(rèn)值)和 MYISAM 。
**注意** 使用 `internal_tmp_disk_storage_engine=INNODB` 生成超過 `InnoDB` 行或列限制的臨時表的查詢, 如果返回行大小太大或列錯誤太多。解決方法是設(shè)置 `internal_tmp_disk_storage_engine` 為 `MYISAM`。
臨時表存儲格式
存儲器內(nèi)臨時表由 MEMORY 存儲引擎管理,存儲引擎使用固定長度的行格式。VARCHAR 和 VARBINARY 列值填充到最大列長度,實際上將它們存儲為 CHAR 和 BINARY 列。
在磁盤上的臨時表由管理 InnoDB 或 MyISAM 存儲引擎(取決于 internal_tmp_disk_storage_engine 設(shè)置)。兩個引擎使用動態(tài)寬度行格式存儲臨時表。列只需要盡可能多的存儲空間,與使用固定長度行的磁盤表相比,減少了磁盤 I/O 和空間要求以及處理時間。
對于最初在內(nèi)存中創(chuàng)建內(nèi)部臨時表的語句,然后將其轉(zhuǎn)換為磁盤表,可能會通過跳過轉(zhuǎn)換步驟并在磁盤上創(chuàng)建表來實現(xiàn)更好的性能。big_tables 系統(tǒng)變量可以用來強制內(nèi)部臨時表的磁盤存儲。
翻譯的有問題的地方,請大家多多指教。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30564.html
摘要:所以,使用存儲引擎的表,讀取和寫入這兩種操作是互斥的。版本時默認(rèn)支持為適用場景非事務(wù)型應(yīng)用本身時一種非事務(wù)型存儲引擎,也就是說是不支持事務(wù)的。空間類應(yīng)用在之前,是唯一支持空間函數(shù)的存儲引擎。 1. mysql 5.5之前版本默認(rèn)存儲引擎 1.1 因為這個原因現(xiàn)在還有大量服務(wù)器在使用這myisam引擎的表 1.2 myisam是mysql大部分系統(tǒng)表和臨時表使用的存儲引擎 showImg...
閱讀 1600·2021-09-23 11:21
閱讀 2357·2021-09-07 10:13
閱讀 843·2021-09-02 10:19
閱讀 1140·2019-08-30 15:44
閱讀 1732·2019-08-30 13:18
閱讀 1920·2019-08-30 11:15
閱讀 1115·2019-08-29 17:17
閱讀 2024·2019-08-29 15:31