mysql 的group by 臨時表一些總結

2021-10-09 15:21:22 字數 1119 閱讀 5209

記憶體表使用場景:

1.union執行流程

2.group by 執行流程

3.order by rand()

用到二維表的特性需要用到內部臨時表,比如 distinct ,group by.

記憶體臨時表使用memory引擎建立,不同於innodb引擎,order by rand() 使用了記憶體臨時表,記憶體臨時表排序的時候使用了 rowid 排序方法。

tmp_table_size 這個配置限制了記憶體臨時表的大小,預設值是 16m。如果臨時表大小超過了 tmp_table_size,那麼記憶體臨時表就會轉成磁碟臨時表(sort_buffer也是如此)。

sort_buffer、join_buffer、記憶體臨時表和磁碟臨時表 都是server層的,引擎間共用.

sort_buffer:extra 這個欄位中的「using filesort」表示的就是需要排序,mysql 會給每個執行緒分配一塊記憶體用於排序,稱為 sort_buffer。

group by 的順序

1 建立乙個內部臨時表,初始化字段 a(分組字段) b(數量)

2 掃瞄表,乙個個的判斷,a字段值在臨時表不存在,則插入(2,1),如果存在,比如(2,1),則加1,成為(2,2)

3 分組之後,缺省會進行排序,如果不需要順序,用 order by null。

group by 執行流程優化:

1 group by 欄位加索引

2 擴大臨時表記憶體大小

3 如果資料量比較大,直接使用磁碟臨時表

4 如果分組之後,不需要排序,手工 order by null

order by rand()會用到記憶體臨時表。

extra 字段顯示 using temporary,表示的是需要使用臨時表,臨時表有記憶體臨時表和硬碟臨時表;using filesort,表示的是需要執行排序操作。

排序方法的話,buffer_size能放,會根據效能考量,比如取較少的資料,使用優先佇列排序,較多就使用快排;超過buffer_size,則需要使用外部的磁碟檔案存資料,使用歸併排序。

記憶體臨時表使用memory引擎建立,它的rowid就是陣列的下標索引,可以理解為陣列下標;磁碟臨時表使用的innodb引擎建立,這時候rowid就是隱式的行主鍵id。

mysql 減少group by 的開銷

group by 一般 和集合函式一起使用,使用情況最多的 是count 即將 資料按照一定條件分組,再統計每一組的總數,顯然這是非常消耗資源的一種做法.mysql 36軍規裡 表示盡量少使用 count 也是這個原因.如果想對多種條件進行 統計 可以使用 判斷語句 如sum if sum cses...

mysql 臨時表 漢字 mysql的臨時表用法

delimiter use qgroupdata drop procedure if exists ex print bg kdd search create definer root procedure ex print bg kdd search where varchar 2000 查詢條件 ...

mysql臨時表更新 MySql 臨時表

今天在專案中遇到乙個,當mysql的in語句中資料量很大時,建立乙個臨時表的例子。於是樓主整理了一下關於臨時表的知識,與大家分享一下 首先,臨時表只在當前連線可見,當關閉連線時,mysql會自動刪除表並釋放所有空間。因此在不同的連線中可以建立同名的臨時表,並且操作屬於本連線的臨時表。建立臨時表 cr...