- 相關(guān)推薦
Linux數據庫MySQL內部臨時(shí)表策略
MySQL內部臨時(shí)表的使用有一定的策略,從源碼中關(guān)于SQL查詢(xún)是否需要內部臨時(shí)表?梢钥偨Y如下:
1、DISTINCT查詢(xún),但是簡(jiǎn)單的DISTINCT查詢(xún),比如對primary key、unique key等DISTINCT查詢(xún)時(shí),查詢(xún)優(yōu)化器會(huì )將DISTINCT條件優(yōu)化,去除DISTINCT條件,也不會(huì )創(chuàng )建臨時(shí)表;
2、不是第一個(gè)表的字段使用ORDER BY 或者GROUP BY;
3、ORDER BY和GROUP BY使用不同的順序;
4、用戶(hù)需要緩存結果;
5、ROLLUP查詢(xún)。
源碼如下所示
代碼地址:sql_select.cc:854, 函數:JOIN::optimize(),位置:sql_select.cc:1399
/*
Check if we need to create a temporary table.
This has to be done if all tables are not already read (const tables)
and one of the following conditions holds:
- We are using DISTINCT (simple distincts are already optimized away)
- We are using an ORDER BY or GROUP BY on fields not in the first table
- We are using different ORDER BY and GROUP BY orders
- The user wants us to buffer the result.
When the WITH ROLLUP modifier is present, we cannot skip temporary table
creation for the DISTINCT clause just because there are only const tables.
*/
need_tmp= (( const_tables != tables &&
(( select_distinct || !simple_order || !simple_group) ||
( group_list && order ) ||
test(select_options & OPTION_BUFFER_RESULT))) ||
( rollup.state != ROLLUP:: STATE_NONE && select_distinct ));
內部臨時(shí)表使用原則
但是使用了內部臨時(shí)表,那么他是怎么存儲的呢?原則是這樣的:
1、當查詢(xún)結果較小的情況下,使用heap存儲引擎進(jìn)行存儲。也就是說(shuō)在內存中存儲查詢(xún)結果。
2、當查詢(xún)結果較大的情況下,使用myisam存儲引擎進(jìn)行存儲。
3、當查詢(xún)結果最初較小,但是不斷增大的情況下,將會(huì )有從heap存儲引擎轉化為myisam存儲引擎存儲查詢(xún)結果。
什么情況算是查詢(xún)結果較小呢?從源碼中if的幾個(gè)參數可以看出:
1、有blob字段的情況;
2、使用唯一限制的情況;
3、當前表定義為大表的情況;
4、查詢(xún)結果的選項為小結果集的情況;
5、查詢(xún)結果的選項為強制使用myisam的情況。
【Linux數據庫MySQL內部臨時(shí)表策略】相關(guān)文章:
2016年Linux認證基礎知識:mysql數據庫的全量備份08-25
jboss配置mysql數據庫連接池09-02
數據庫系統的內部結構體系簡(jiǎn)介10-21
企業(yè)內部物流管理策略10-21
mysql SQL語(yǔ)句積累參考10-02
PHP常用MySql操作介紹05-11
Linux認證概念10-29