MySQL 36 內部臨時表

2021-10-13 10:04:00 字數 1939 閱讀 3261

36.1 mysql中的兩種臨時表

通過create temporary table建立的臨時表,這種臨時表稱為外部臨時表。這種臨時表只對當前使用者可見,當前會話結束的時候,該臨時表會自動關閉。這種臨時表的命名與非臨時表可以同名。

內部臨時表會被mysql自動建立並用來儲存某些操作的中間結果,通過explain或者show status可以檢視mysql是否使用了內部臨時表用來幫助完成某個操作。

內部臨時表有兩種型別:①:記憶體臨時表:所有資料都會存在記憶體中。②:磁碟臨時表:資料儲存在磁碟上,使用那種型別的內部臨時表取決於引數tmp_table_size,當需求的臨時表大小大於引數設定值,則會轉用磁碟臨時表。

mysql 臨時表使用

36.2 內部臨時表的使用時機

using where ;using index;using null解釋

1. union

現有表t,欄位有主鍵id,欄位a、b,a帶有普通索引,資料(1,1,1)到(1000,1000,1000)。

現在執行如下語句:通過explain命令我們可以看到,在extra欄位可以看到:第三行可以看到using temporary,表示使用了臨時表。

它的執行流程如下:

如果使用的是union all,則使用不到臨時表。

2. group by

現有如下sql,我們可以通過explain命令可以看見extra欄位中:

執行流程如下:

36.3 group by 的優化

優化有兩個方向,①:將分組的資料建立乙個索引,因為索引是有序,所以不需要臨時表;②如果可能的話,使用的臨時表直接磁碟臨時表,可減少麻煩。

1.索引

通過如下方式新增索引,分組的資料如果有索引,就不需要臨時表,因為它可以直接從索引上數出有多少個。

# 加欄位

alter

table t add m int(11

)not

null

# 加索引

alter

table t add

index m(m)

;# 賦值

update t set m = id%

10

我們再執行explain命令就可以發現差異,沒有using temporary

不過這個麻煩了,在mysql5.6之後,引入 generated column 機制 ,可以直接達到上面的效果。

sql如下:

alter

table t add

column z int generated always as

(id %10)

,add

index

(z);

2.直接排序

這個情況前提為記憶體表不夠用的情況下,我們通過引數設定直接使用磁碟臨時表,避免浪費。我們加上 sql_big_result即可直接使用磁碟臨時表。

select sql_big_result id%

10as m,

from t group

by m;

條件查詢(mysql 36)

高階2 條件查詢 語法 select 查詢列表 from 表名where 篩選條件 分類 一,按條件表達篩選 條件運算子 二,按邏輯表示式篩選 邏輯運算子 and or not 和and 兩個都為true,結果為true,反之為false 和or 如果有乙個為true,結果為 true,反之為fla...

36 臨時表和臨時表

臨時表特點 建表語法是create temporary table乙個臨時表只能被建立它的session訪問,對其他執行緒不可見。臨時表和普通表可以同名。同乙個session內有臨時表和普通表的時候,show crete語句 增刪改查訪問的是臨時表。show tabls命令不顯示臨時表。由於臨時表只...

消除mysql內部臨時表

在一些sql請求中,mysql會建立臨時表,可能建立到記憶體中,也可能由記憶體轉存到磁碟。會建立臨時表的查詢 1.group by的列沒有索引,必建立臨時表 2.order by與group by 為不同列時,或多表查詢時order by,group by 包含的列不是第一張表的列,必產生臨時表。3...