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