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