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...