亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

MySQL臨時表

2024-09-10 09:23:37
11
0
mysql版本:8.0.30

普通臨時表

用戶創建臨時表(只有創建臨時表的會話才能查看其創建的臨時表的內容)
CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; --- 可以創建和普通表同名臨時表,其他會話可以看到普通表(因為看不到其他會話創建的臨時表); CREATE TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; --- 當存在同名的臨時表時,會話都是優先處理臨時表(而不是普通表), --- 包括:select、update、delete、drop、alter 等操作
 
回收時機
  1. 會話斷開,自動回收用戶創建的臨時表;
  2. 可以通過 drop table 刪除用戶創建的臨時表,例如:drop table t1;

內部臨時表

產生場景(更多可參考官方文檔
  1. SQL 包含 union | union distinct 關鍵字
  2. SQL 中存在派生表
  3. SQL 中包含 with 關鍵字
  4. SQL 中的order by 和 group by 的字段不同
  5. SQL 為多表 update
  6. SQL 中包含 distinct 和 order by 兩個關鍵字
簡單判斷方式
  1. 執行計劃中Extra包含了Using temporary ,或者包含 Using filesort (使用文件排序,臨時文件)
  2. 查詢information_schema.innodb_session_temp_tablespaces,若表的 ID 列變為了show processlist 中的 id 列的值,那么說明 SQL 語句使用了臨時表空間

相關參數說明

innodb_temp_tablespaces_dir: 定義了創建 會話臨時表空間的位置,默認是數據目錄下的#innodb_temp 目錄
internal_tmp_mem_storage_engine :定義內部臨時表使用TempTable (默認) 還是 MEMORY
internal_tmp_disk_storage_engine :8.0.15前可配置為innodb或myisam,8.0.16廢棄,固定使用innodb。
tmp_table_size :從8.0.28開始,定義TempTable存儲引擎允許創建的單個內存臨時表大小,當超過該限制時,mysql會將該臨時表轉換成innodb引擎的磁盤臨時表
temptable_max_ram :內存表使用的內存上限,大于該值,則使用一部分磁盤映射為內存。
temptable_max_mmap :當內存使用量大于temptable_max_ram 時,MySQL 會使用 mmap 機制, 將一部分磁盤映射作為內存使用,這一部分允許的最大值即為temptable_max_mmap。
總的內存臨時表大小限制則由temptable_max_ram和 temptable_max_mmap控制,若tmp_table_size更大,則無法創建大于二者之和的內存臨時表。 當內存臨時表超過二者之和后,MySQL也會將其轉換成 磁盤臨時表
temptable空間監控
select * from performance_schema.memory_summary_global_by_event_name where event_name in('memory/temptable/physical_ram','memory/temptable/physical_disk') 
 
0條評論
作者已關閉評論
zzzzgj
9文章數
1粉絲數
zzzzgj
9 文章 | 1 粉絲
原創

MySQL臨時表

2024-09-10 09:23:37
11
0
mysql版本:8.0.30

普通臨時表

用戶創建臨時表(只有創建臨時表的會話才能查看其創建的臨時表的內容)
CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; --- 可以創建和普通表同名臨時表,其他會話可以看到普通表(因為看不到其他會話創建的臨時表); CREATE TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB; --- 當存在同名的臨時表時,會話都是優先處理臨時表(而不是普通表), --- 包括:select、update、delete、drop、alter 等操作
 
回收時機
  1. 會話斷開,自動回收用戶創建的臨時表;
  2. 可以通過 drop table 刪除用戶創建的臨時表,例如:drop table t1;

內部臨時表

產生場景(更多可參考官方文檔
  1. SQL 包含 union | union distinct 關鍵字
  2. SQL 中存在派生表
  3. SQL 中包含 with 關鍵字
  4. SQL 中的order by 和 group by 的字段不同
  5. SQL 為多表 update
  6. SQL 中包含 distinct 和 order by 兩個關鍵字
簡單判斷方式
  1. 執行計劃中Extra包含了Using temporary ,或者包含 Using filesort (使用文件排序,臨時文件)
  2. 查詢information_schema.innodb_session_temp_tablespaces,若表的 ID 列變為了show processlist 中的 id 列的值,那么說明 SQL 語句使用了臨時表空間

相關參數說明

innodb_temp_tablespaces_dir: 定義了創建 會話臨時表空間的位置,默認是數據目錄下的#innodb_temp 目錄
internal_tmp_mem_storage_engine :定義內部臨時表使用TempTable (默認) 還是 MEMORY
internal_tmp_disk_storage_engine :8.0.15前可配置為innodb或myisam,8.0.16廢棄,固定使用innodb。
tmp_table_size :從8.0.28開始,定義TempTable存儲引擎允許創建的單個內存臨時表大小,當超過該限制時,mysql會將該臨時表轉換成innodb引擎的磁盤臨時表
temptable_max_ram :內存表使用的內存上限,大于該值,則使用一部分磁盤映射為內存。
temptable_max_mmap :當內存使用量大于temptable_max_ram 時,MySQL 會使用 mmap 機制, 將一部分磁盤映射作為內存使用,這一部分允許的最大值即為temptable_max_mmap。
總的內存臨時表大小限制則由temptable_max_ram和 temptable_max_mmap控制,若tmp_table_size更大,則無法創建大于二者之和的內存臨時表。 當內存臨時表超過二者之和后,MySQL也會將其轉換成 磁盤臨時表
temptable空間監控
select * from performance_schema.memory_summary_global_by_event_name where event_name in('memory/temptable/physical_ram','memory/temptable/physical_disk') 
 
文章來自個人專欄
文章 | 訂閱
0條評論
作者已關閉評論
作者已關閉評論
0
0